ptomato-ramaze 2009.02

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 (592) hide show
  1. data/README.md +481 -0
  2. data/Rakefile +248 -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 +40 -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/partial.rb +28 -0
  171. data/examples/basic/simple.rb +56 -0
  172. data/examples/helpers/cache.rb +31 -0
  173. data/examples/helpers/form_with_sequel.rb +24 -0
  174. data/examples/helpers/httpdigest.rb +108 -0
  175. data/examples/helpers/identity.rb +18 -0
  176. data/examples/helpers/nitro_form.rb +23 -0
  177. data/examples/helpers/paginate.rb +71 -0
  178. data/examples/helpers/provide.rb +23 -0
  179. data/examples/helpers/rest.rb +28 -0
  180. data/examples/helpers/simple_captcha.rb +29 -0
  181. data/examples/misc/css.rb +37 -0
  182. data/examples/misc/facebook.rb +159 -0
  183. data/examples/misc/memleak_detector.rb +32 -0
  184. data/examples/misc/nagoro_element.rb +43 -0
  185. data/examples/misc/ramaise.rb +132 -0
  186. data/examples/misc/rapp.rb +45 -0
  187. data/examples/misc/sequel_scaffolding.rb +34 -0
  188. data/examples/misc/simple_auth.rb +35 -0
  189. data/examples/templates/template/external.amrita +19 -0
  190. data/examples/templates/template/external.haml +22 -0
  191. data/examples/templates/template/external.liquid +28 -0
  192. data/examples/templates/template/external.mab +30 -0
  193. data/examples/templates/template/external.nag +28 -0
  194. data/examples/templates/template/external.redcloth +19 -0
  195. data/examples/templates/template/external.rem +30 -0
  196. data/examples/templates/template/external.rhtml +28 -0
  197. data/examples/templates/template/external.tenjin +28 -0
  198. data/examples/templates/template/external.xsl +57 -0
  199. data/examples/templates/template/external.zmr +28 -0
  200. data/examples/templates/template_amrita2.rb +74 -0
  201. data/examples/templates/template_erubis.rb +53 -0
  202. data/examples/templates/template_ezamar.rb +50 -0
  203. data/examples/templates/template_haml.rb +50 -0
  204. data/examples/templates/template_liquid.rb +65 -0
  205. data/examples/templates/template_markaby.rb +58 -0
  206. data/examples/templates/template_nagoro.rb +51 -0
  207. data/examples/templates/template_redcloth.rb +59 -0
  208. data/examples/templates/template_remarkably.rb +55 -0
  209. data/examples/templates/template_tenjin.rb +53 -0
  210. data/examples/templates/template_xslt.rb +49 -0
  211. data/lib/proto/controller/init.rb +11 -0
  212. data/lib/proto/controller/main.rb +20 -0
  213. data/lib/proto/model/init.rb +4 -0
  214. data/lib/proto/public/.htaccess +24 -0
  215. data/lib/proto/public/css/ramaze_error.css +90 -0
  216. data/lib/proto/public/dispatch.fcgi +11 -0
  217. data/lib/proto/public/favicon.ico +0 -0
  218. data/lib/proto/public/js/jquery.js +3549 -0
  219. data/lib/proto/public/ramaze.png +0 -0
  220. data/lib/proto/spec/main.rb +25 -0
  221. data/lib/proto/start.rb +12 -0
  222. data/lib/proto/start.ru +16 -0
  223. data/lib/proto/view/error.xhtml +64 -0
  224. data/lib/proto/view/index.xhtml +34 -0
  225. data/lib/proto/view/page.xhtml +27 -0
  226. data/lib/ramaze/action/render.rb +192 -0
  227. data/lib/ramaze/action.rb +159 -0
  228. data/lib/ramaze/adapter/base.rb +128 -0
  229. data/lib/ramaze/adapter/cgi.rb +20 -0
  230. data/lib/ramaze/adapter/ebb.rb +18 -0
  231. data/lib/ramaze/adapter/evented_mongrel.rb +7 -0
  232. data/lib/ramaze/adapter/fake.rb +12 -0
  233. data/lib/ramaze/adapter/fcgi.rb +18 -0
  234. data/lib/ramaze/adapter/lsws.rb +19 -0
  235. data/lib/ramaze/adapter/mongrel.rb +21 -0
  236. data/lib/ramaze/adapter/scgi.rb +18 -0
  237. data/lib/ramaze/adapter/swiftiplied_mongrel.rb +7 -0
  238. data/lib/ramaze/adapter/thin.rb +17 -0
  239. data/lib/ramaze/adapter/webrick.rb +43 -0
  240. data/lib/ramaze/adapter.rb +97 -0
  241. data/lib/ramaze/cache/file.rb +71 -0
  242. data/lib/ramaze/cache/memcached.rb +69 -0
  243. data/lib/ramaze/cache/memory.rb +6 -0
  244. data/lib/ramaze/cache/yaml_store.rb +68 -0
  245. data/lib/ramaze/cache.rb +114 -0
  246. data/lib/ramaze/contrib/email.rb +86 -0
  247. data/lib/ramaze/contrib/facebook/facebook.rb +171 -0
  248. data/lib/ramaze/contrib/facebook.rb +23 -0
  249. data/lib/ramaze/contrib/file_cache.rb +3 -0
  250. data/lib/ramaze/contrib/gems.rb +78 -0
  251. data/lib/ramaze/contrib/gettext/mo.rb +155 -0
  252. data/lib/ramaze/contrib/gettext/parser.rb +46 -0
  253. data/lib/ramaze/contrib/gettext/po.rb +109 -0
  254. data/lib/ramaze/contrib/gettext.rb +113 -0
  255. data/lib/ramaze/contrib/gzip_filter.rb +69 -0
  256. data/lib/ramaze/contrib/maruku_uv.rb +59 -0
  257. data/lib/ramaze/contrib/profiling.rb +36 -0
  258. data/lib/ramaze/contrib/rest.rb +17 -0
  259. data/lib/ramaze/contrib/sequel/create_join.rb +25 -0
  260. data/lib/ramaze/contrib/sequel/fill.rb +12 -0
  261. data/lib/ramaze/contrib/sequel/form_field.rb +129 -0
  262. data/lib/ramaze/contrib/sequel/image.rb +198 -0
  263. data/lib/ramaze/contrib/sequel/relation.rb +82 -0
  264. data/lib/ramaze/contrib/sequel_cache.rb +92 -0
  265. data/lib/ramaze/contrib.rb +82 -0
  266. data/lib/ramaze/controller/error.rb +46 -0
  267. data/lib/ramaze/controller/main.rb +2 -0
  268. data/lib/ramaze/controller/resolve.rb +278 -0
  269. data/lib/ramaze/controller.rb +288 -0
  270. data/lib/ramaze/current/request.rb +231 -0
  271. data/lib/ramaze/current/response.rb +37 -0
  272. data/lib/ramaze/current/session/flash.rb +88 -0
  273. data/lib/ramaze/current/session/hash.rb +62 -0
  274. data/lib/ramaze/current/session.rb +179 -0
  275. data/lib/ramaze/current.rb +51 -0
  276. data/lib/ramaze/dispatcher/action.rb +50 -0
  277. data/lib/ramaze/dispatcher/directory.rb +119 -0
  278. data/lib/ramaze/dispatcher/error.rb +108 -0
  279. data/lib/ramaze/dispatcher/file.rb +100 -0
  280. data/lib/ramaze/dispatcher.rb +145 -0
  281. data/lib/ramaze/error.rb +24 -0
  282. data/lib/ramaze/gestalt.rb +124 -0
  283. data/lib/ramaze/helper/aspect.rb +106 -0
  284. data/lib/ramaze/helper/auth.rb +125 -0
  285. data/lib/ramaze/helper/bench.rb +43 -0
  286. data/lib/ramaze/helper/cache.rb +140 -0
  287. data/lib/ramaze/helper/cgi.rb +39 -0
  288. data/lib/ramaze/helper/flash.rb +74 -0
  289. data/lib/ramaze/helper/form.rb +284 -0
  290. data/lib/ramaze/helper/formatting.rb +162 -0
  291. data/lib/ramaze/helper/gestalt.rb +15 -0
  292. data/lib/ramaze/helper/gravatar.rb +32 -0
  293. data/lib/ramaze/helper/httpdigest.rb +88 -0
  294. data/lib/ramaze/helper/identity.rb +119 -0
  295. data/lib/ramaze/helper/link.rb +122 -0
  296. data/lib/ramaze/helper/markaby.rb +31 -0
  297. data/lib/ramaze/helper/maruku.rb +9 -0
  298. data/lib/ramaze/helper/nitroform.rb +14 -0
  299. data/lib/ramaze/helper/pager.rb +366 -0
  300. data/lib/ramaze/helper/paginate.rb +233 -0
  301. data/lib/ramaze/helper/partial.rb +105 -0
  302. data/lib/ramaze/helper/redirect.rb +100 -0
  303. data/lib/ramaze/helper/rest.rb +43 -0
  304. data/lib/ramaze/helper/sendfile.rb +16 -0
  305. data/lib/ramaze/helper/sequel.rb +55 -0
  306. data/lib/ramaze/helper/simple_captcha.rb +31 -0
  307. data/lib/ramaze/helper/stack.rb +77 -0
  308. data/lib/ramaze/helper/tagz.rb +19 -0
  309. data/lib/ramaze/helper/thread.rb +17 -0
  310. data/lib/ramaze/helper/ultraviolet.rb +44 -0
  311. data/lib/ramaze/helper/user.rb +110 -0
  312. data/lib/ramaze/helper/xhtml.rb +23 -0
  313. data/lib/ramaze/helper.rb +87 -0
  314. data/lib/ramaze/log/analogger.rb +40 -0
  315. data/lib/ramaze/log/growl.rb +38 -0
  316. data/lib/ramaze/log/hub.rb +41 -0
  317. data/lib/ramaze/log/informer.rb +128 -0
  318. data/lib/ramaze/log/knotify.rb +28 -0
  319. data/lib/ramaze/log/logger.rb +26 -0
  320. data/lib/ramaze/log/logging.rb +89 -0
  321. data/lib/ramaze/log/rotatinginformer.rb +168 -0
  322. data/lib/ramaze/log/syslog.rb +51 -0
  323. data/lib/ramaze/log/xosd.rb +92 -0
  324. data/lib/ramaze/log.rb +27 -0
  325. data/lib/ramaze/option/dsl.rb +45 -0
  326. data/lib/ramaze/option/holder.rb +131 -0
  327. data/lib/ramaze/option/merger.rb +108 -0
  328. data/lib/ramaze/option.rb +156 -0
  329. data/lib/ramaze/reloader/watch_inotify.rb +85 -0
  330. data/lib/ramaze/reloader/watch_stat.rb +58 -0
  331. data/lib/ramaze/reloader.rb +170 -0
  332. data/lib/ramaze/route.rb +97 -0
  333. data/lib/ramaze/setup.rb +50 -0
  334. data/lib/ramaze/snippets/array/put_within.rb +44 -0
  335. data/lib/ramaze/snippets/binding/locals.rb +25 -0
  336. data/lib/ramaze/snippets/blankslate.rb +7 -0
  337. data/lib/ramaze/snippets/dictionary.rb +504 -0
  338. data/lib/ramaze/snippets/divide.rb +22 -0
  339. data/lib/ramaze/snippets/fiber.rb +63 -0
  340. data/lib/ramaze/snippets/kernel/constant.rb +41 -0
  341. data/lib/ramaze/snippets/kernel/pretty_inspect.rb +21 -0
  342. data/lib/ramaze/snippets/metaid.rb +17 -0
  343. data/lib/ramaze/snippets/numeric/filesize_format.rb +32 -0
  344. data/lib/ramaze/snippets/numeric/time.rb +63 -0
  345. data/lib/ramaze/snippets/object/__dir__.rb +29 -0
  346. data/lib/ramaze/snippets/object/acquire.rb +37 -0
  347. data/lib/ramaze/snippets/object/instance_variable_defined.rb +19 -0
  348. data/lib/ramaze/snippets/object/pretty.rb +16 -0
  349. data/lib/ramaze/snippets/object/scope.rb +18 -0
  350. data/lib/ramaze/snippets/object/traits.rb +76 -0
  351. data/lib/ramaze/snippets/ordered_set.rb +51 -0
  352. data/lib/ramaze/snippets/proc/locals.rb +19 -0
  353. data/lib/ramaze/snippets/ramaze/acquire.rb +31 -0
  354. data/lib/ramaze/snippets/ramaze/caller_info.rb +30 -0
  355. data/lib/ramaze/snippets/ramaze/caller_lines.rb +51 -0
  356. data/lib/ramaze/snippets/ramaze/deprecated.rb +21 -0
  357. data/lib/ramaze/snippets/ramaze/fiber.rb +24 -0
  358. data/lib/ramaze/snippets/ramaze/state.rb +86 -0
  359. data/lib/ramaze/snippets/ramaze/struct.rb +45 -0
  360. data/lib/ramaze/snippets/string/camel_case.rb +21 -0
  361. data/lib/ramaze/snippets/string/color.rb +31 -0
  362. data/lib/ramaze/snippets/string/each.rb +19 -0
  363. data/lib/ramaze/snippets/string/end_with.rb +20 -0
  364. data/lib/ramaze/snippets/string/esc.rb +34 -0
  365. data/lib/ramaze/snippets/string/ord.rb +21 -0
  366. data/lib/ramaze/snippets/string/snake_case.rb +21 -0
  367. data/lib/ramaze/snippets/string/start_with.rb +19 -0
  368. data/lib/ramaze/snippets/string/unindent.rb +28 -0
  369. data/lib/ramaze/snippets/thread/into.rb +18 -0
  370. data/lib/ramaze/snippets.rb +22 -0
  371. data/lib/ramaze/spec/helper/bacon.rb +7 -0
  372. data/lib/ramaze/spec/helper/browser.rb +88 -0
  373. data/lib/ramaze/spec/helper/mock_http.rb +64 -0
  374. data/lib/ramaze/spec/helper/pretty_output.rb +82 -0
  375. data/lib/ramaze/spec/helper/requester.rb +63 -0
  376. data/lib/ramaze/spec/helper/simple_http.rb +434 -0
  377. data/lib/ramaze/spec/helper/snippets.rb +14 -0
  378. data/lib/ramaze/spec/helper.rb +135 -0
  379. data/lib/ramaze/spec.rb +1 -0
  380. data/lib/ramaze/store/default.rb +109 -0
  381. data/lib/ramaze/template/amrita2.rb +49 -0
  382. data/lib/ramaze/template/builder.rb +28 -0
  383. data/lib/ramaze/template/erubis.rb +41 -0
  384. data/lib/ramaze/template/ezamar/element.rb +169 -0
  385. data/lib/ramaze/template/ezamar/engine.rb +76 -0
  386. data/lib/ramaze/template/ezamar/morpher.rb +135 -0
  387. data/lib/ramaze/template/ezamar/render_partial.rb +39 -0
  388. data/lib/ramaze/template/ezamar/textpow.syntax +34 -0
  389. data/lib/ramaze/template/ezamar.rb +42 -0
  390. data/lib/ramaze/template/haml.rb +37 -0
  391. data/lib/ramaze/template/liquid.rb +36 -0
  392. data/lib/ramaze/template/markaby.rb +52 -0
  393. data/lib/ramaze/template/maruku.rb +34 -0
  394. data/lib/ramaze/template/nagoro.rb +52 -0
  395. data/lib/ramaze/template/none.rb +14 -0
  396. data/lib/ramaze/template/redcloth.rb +25 -0
  397. data/lib/ramaze/template/remarkably.rb +38 -0
  398. data/lib/ramaze/template/sass.rb +38 -0
  399. data/lib/ramaze/template/tagz.rb +79 -0
  400. data/lib/ramaze/template/tenjin.rb +74 -0
  401. data/lib/ramaze/template/xslt.rb +100 -0
  402. data/lib/ramaze/template.rb +87 -0
  403. data/lib/ramaze/tool/create.rb +48 -0
  404. data/lib/ramaze/tool/daemonize.rb +37 -0
  405. data/lib/ramaze/tool/localize.rb +202 -0
  406. data/lib/ramaze/tool/mime.rb +35 -0
  407. data/lib/ramaze/tool/mime_types.yaml +615 -0
  408. data/lib/ramaze/tool/project_creator.rb +111 -0
  409. data/lib/ramaze/tool/record.rb +6 -0
  410. data/lib/ramaze/tool.rb +9 -0
  411. data/lib/ramaze/trinity.rb +16 -0
  412. data/lib/ramaze/version.rb +6 -0
  413. data/lib/ramaze.rb +139 -0
  414. data/lib/vendor/bacon.rb +323 -0
  415. data/rake_tasks/conf.rake +71 -0
  416. data/rake_tasks/coverage.rake +45 -0
  417. data/rake_tasks/gem.rake +74 -0
  418. data/rake_tasks/git.rake +41 -0
  419. data/rake_tasks/maintenance.rake +386 -0
  420. data/rake_tasks/metric.rake +24 -0
  421. data/rake_tasks/release.rake +76 -0
  422. data/rake_tasks/spec.rake +61 -0
  423. data/ramaze.gemspec +611 -0
  424. data/spec/contrib/profiling.rb +29 -0
  425. data/spec/contrib/sequel/fill.rb +47 -0
  426. data/spec/examples/caching.rb +19 -0
  427. data/spec/examples/css.rb +15 -0
  428. data/spec/examples/element.rb +15 -0
  429. data/spec/examples/hello.rb +11 -0
  430. data/spec/examples/linking.rb +18 -0
  431. data/spec/examples/simple.rb +45 -0
  432. data/spec/examples/simple_auth.rb +32 -0
  433. data/spec/examples/templates/template_amrita2.rb +16 -0
  434. data/spec/examples/templates/template_erubis.rb +23 -0
  435. data/spec/examples/templates/template_ezamar.rb +23 -0
  436. data/spec/examples/templates/template_haml.rb +23 -0
  437. data/spec/examples/templates/template_liquid.rb +29 -0
  438. data/spec/examples/templates/template_markaby.rb +23 -0
  439. data/spec/examples/templates/template_redcloth.rb +28 -0
  440. data/spec/examples/templates/template_remarkably.rb +23 -0
  441. data/spec/examples/templates/template_tenjin.rb +28 -0
  442. data/spec/helper.rb +3 -0
  443. data/spec/ramaze/action/basics.rb +36 -0
  444. data/spec/ramaze/action/cache.rb +87 -0
  445. data/spec/ramaze/action/file_cache.rb +70 -0
  446. data/spec/ramaze/action/layout.rb +190 -0
  447. data/spec/ramaze/action/render.rb +31 -0
  448. data/spec/ramaze/action/view/bar.xhtml +1 -0
  449. data/spec/ramaze/action/view/instancevars/layout.xhtml +1 -0
  450. data/spec/ramaze/action/view/other_wrapper.xhtml +1 -0
  451. data/spec/ramaze/action/view/single_wrapper.xhtml +1 -0
  452. data/spec/ramaze/action/view/sub/sub_wrapper.xhtml +1 -0
  453. data/spec/ramaze/adapter/ebb.rb +12 -0
  454. data/spec/ramaze/adapter/mongrel.rb +12 -0
  455. data/spec/ramaze/adapter/record.rb +31 -0
  456. data/spec/ramaze/adapter/webrick.rb +12 -0
  457. data/spec/ramaze/adapter.rb +49 -0
  458. data/spec/ramaze/cache.rb +140 -0
  459. data/spec/ramaze/controller/actionless_templates.rb +32 -0
  460. data/spec/ramaze/controller/resolve.rb +32 -0
  461. data/spec/ramaze/controller/subclass.rb +36 -0
  462. data/spec/ramaze/controller/template_resolving.rb +113 -0
  463. data/spec/ramaze/controller/view/bar.xhtml +1 -0
  464. data/spec/ramaze/controller/view/base/another.xhtml +1 -0
  465. data/spec/ramaze/controller/view/greet.xhtml +1 -0
  466. data/spec/ramaze/controller/view/list.xhtml +1 -0
  467. data/spec/ramaze/controller/view/other/greet/other.xhtml +1 -0
  468. data/spec/ramaze/controller/view/other_wrapper.xhtml +1 -0
  469. data/spec/ramaze/controller.rb +180 -0
  470. data/spec/ramaze/current/request.rb +30 -0
  471. data/spec/ramaze/current/session.rb +97 -0
  472. data/spec/ramaze/dispatcher/directory.rb +55 -0
  473. data/spec/ramaze/dispatcher/file.rb +60 -0
  474. data/spec/ramaze/dispatcher/public/favicon.ico +0 -0
  475. data/spec/ramaze/dispatcher/public/file name.txt +1 -0
  476. data/spec/ramaze/dispatcher/public/test_download.css +141 -0
  477. data/spec/ramaze/dispatcher.rb +31 -0
  478. data/spec/ramaze/element.rb +107 -0
  479. data/spec/ramaze/error.rb +94 -0
  480. data/spec/ramaze/gestalt.rb +131 -0
  481. data/spec/ramaze/helper/aspect.rb +101 -0
  482. data/spec/ramaze/helper/auth.rb +66 -0
  483. data/spec/ramaze/helper/cache.rb +160 -0
  484. data/spec/ramaze/helper/cgi.rb +43 -0
  485. data/spec/ramaze/helper/file.rb +18 -0
  486. data/spec/ramaze/helper/flash.rb +133 -0
  487. data/spec/ramaze/helper/form.rb +118 -0
  488. data/spec/ramaze/helper/formatting.rb +54 -0
  489. data/spec/ramaze/helper/link.rb +124 -0
  490. data/spec/ramaze/helper/pager.rb +99 -0
  491. data/spec/ramaze/helper/partial.rb +88 -0
  492. data/spec/ramaze/helper/redirect.rb +112 -0
  493. data/spec/ramaze/helper/simple_captcha.rb +22 -0
  494. data/spec/ramaze/helper/stack.rb +73 -0
  495. data/spec/ramaze/helper/user.rb +43 -0
  496. data/spec/ramaze/helper/view/locals.xhtml +1 -0
  497. data/spec/ramaze/helper/view/loop.xhtml +4 -0
  498. data/spec/ramaze/helper/view/num.xhtml +1 -0
  499. data/spec/ramaze/helper/view/partial.xhtml +1 -0
  500. data/spec/ramaze/helper/view/recursive.xhtml +8 -0
  501. data/spec/ramaze/helper/view/recursive_local_ivars.xhtml +7 -0
  502. data/spec/ramaze/helper/view/recursive_locals.xhtml +7 -0
  503. data/spec/ramaze/helper/view/test_template.xhtml +1 -0
  504. data/spec/ramaze/localize.rb +89 -0
  505. data/spec/ramaze/log/informer.rb +72 -0
  506. data/spec/ramaze/log/syslog.rb +76 -0
  507. data/spec/ramaze/morpher.rb +111 -0
  508. data/spec/ramaze/params.rb +157 -0
  509. data/spec/ramaze/public/error404.xhtml +1 -0
  510. data/spec/ramaze/public/favicon.ico +0 -0
  511. data/spec/ramaze/public/ramaze.png +0 -0
  512. data/spec/ramaze/public/test_download.css +141 -0
  513. data/spec/ramaze/request/ebb.rb +9 -0
  514. data/spec/ramaze/request/mongrel.rb +9 -0
  515. data/spec/ramaze/request/thin.rb +9 -0
  516. data/spec/ramaze/request/webrick.rb +5 -0
  517. data/spec/ramaze/request.rb +185 -0
  518. data/spec/ramaze/rewrite/file.css +1 -0
  519. data/spec/ramaze/rewrite.rb +36 -0
  520. data/spec/ramaze/route.rb +131 -0
  521. data/spec/ramaze/session.rb +94 -0
  522. data/spec/ramaze/store/default.rb +71 -0
  523. data/spec/ramaze/struct.rb +47 -0
  524. data/spec/ramaze/template/amrita2/external.amrita +6 -0
  525. data/spec/ramaze/template/amrita2/sum.amrita +1 -0
  526. data/spec/ramaze/template/amrita2.rb +50 -0
  527. data/spec/ramaze/template/builder/external.rxml +3 -0
  528. data/spec/ramaze/template/builder.rb +51 -0
  529. data/spec/ramaze/template/erubis/sum.rhtml +1 -0
  530. data/spec/ramaze/template/erubis.rb +41 -0
  531. data/spec/ramaze/template/ezamar/another/long/action.zmr +1 -0
  532. data/spec/ramaze/template/ezamar/combined.zmr +1 -0
  533. data/spec/ramaze/template/ezamar/file_only.zmr +1 -0
  534. data/spec/ramaze/template/ezamar/index.zmr +1 -0
  535. data/spec/ramaze/template/ezamar/nested.zmr +1 -0
  536. data/spec/ramaze/template/ezamar/other__index.xhtml +1 -0
  537. data/spec/ramaze/template/ezamar/some__long__action.zmr +1 -0
  538. data/spec/ramaze/template/ezamar/sum.zmr +1 -0
  539. data/spec/ramaze/template/ezamar.rb +63 -0
  540. data/spec/ramaze/template/haml/index.haml +5 -0
  541. data/spec/ramaze/template/haml/locals.haml +2 -0
  542. data/spec/ramaze/template/haml/with_vars.haml +4 -0
  543. data/spec/ramaze/template/haml.rb +66 -0
  544. data/spec/ramaze/template/liquid/index.liquid +1 -0
  545. data/spec/ramaze/template/liquid/products.liquid +45 -0
  546. data/spec/ramaze/template/liquid.rb +99 -0
  547. data/spec/ramaze/template/markaby/external.mab +8 -0
  548. data/spec/ramaze/template/markaby/sum.mab +1 -0
  549. data/spec/ramaze/template/markaby.rb +61 -0
  550. data/spec/ramaze/template/nagoro/another/long/action.nag +1 -0
  551. data/spec/ramaze/template/nagoro/combined.nag +1 -0
  552. data/spec/ramaze/template/nagoro/file_only.nag +1 -0
  553. data/spec/ramaze/template/nagoro/index.nag +1 -0
  554. data/spec/ramaze/template/nagoro/nested.nag +1 -0
  555. data/spec/ramaze/template/nagoro/some__long__action.nag +1 -0
  556. data/spec/ramaze/template/nagoro/sum.nag +1 -0
  557. data/spec/ramaze/template/nagoro.rb +64 -0
  558. data/spec/ramaze/template/ramaze/external.test +1 -0
  559. data/spec/ramaze/template/redcloth/external.redcloth +1 -0
  560. data/spec/ramaze/template/redcloth.rb +38 -0
  561. data/spec/ramaze/template/remarkably/external.rem +8 -0
  562. data/spec/ramaze/template/remarkably/sum.rem +1 -0
  563. data/spec/ramaze/template/remarkably.rb +58 -0
  564. data/spec/ramaze/template/sass/file.css.sass +5 -0
  565. data/spec/ramaze/template/sass.rb +70 -0
  566. data/spec/ramaze/template/tagz/external.tagz +8 -0
  567. data/spec/ramaze/template/tagz/sum.tagz +1 -0
  568. data/spec/ramaze/template/tagz.rb +62 -0
  569. data/spec/ramaze/template/tenjin/external.tenjin +1 -0
  570. data/spec/ramaze/template/tenjin.rb +47 -0
  571. data/spec/ramaze/template/xslt/concat_words.xsl +16 -0
  572. data/spec/ramaze/template/xslt/index.xsl +14 -0
  573. data/spec/ramaze/template/xslt/products.xsl +32 -0
  574. data/spec/ramaze/template/xslt/ruby_version.xsl +14 -0
  575. data/spec/ramaze/template/xslt.rb +90 -0
  576. data/spec/ramaze/template.rb +128 -0
  577. data/spec/snippets/array/put_within.rb +33 -0
  578. data/spec/snippets/binding/locals.rb +9 -0
  579. data/spec/snippets/kernel/constant.rb +23 -0
  580. data/spec/snippets/numeric/filesize_format.rb +12 -0
  581. data/spec/snippets/numeric/time.rb +12 -0
  582. data/spec/snippets/object/__dir__.rb +14 -0
  583. data/spec/snippets/ordered_set.rb +63 -0
  584. data/spec/snippets/ramaze/acquire.rb +77 -0
  585. data/spec/snippets/ramaze/caller_info.rb +39 -0
  586. data/spec/snippets/ramaze/caller_lines.rb +30 -0
  587. data/spec/snippets/string/camel_case.rb +25 -0
  588. data/spec/snippets/string/color.rb +11 -0
  589. data/spec/snippets/string/snake_case.rb +24 -0
  590. data/spec/snippets/string/unindent.rb +43 -0
  591. data/spec/snippets/thread/into.rb +20 -0
  592. metadata +661 -0
@@ -0,0 +1,288 @@
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 'ramaze/helper'
5
+ require 'ramaze/template'
6
+ require 'ramaze/action'
7
+
8
+ require 'ramaze/controller/resolve'
9
+ require 'ramaze/controller/error'
10
+
11
+ module Ramaze
12
+
13
+ # The Controller is responsible for combining and rendering actions.
14
+
15
+ class Controller
16
+ include Helper::Methods
17
+
18
+ helper :redirect, :link, :sendfile, :flash, :cgi, :partial
19
+
20
+ # Whether or not to map this controller on startup automatically
21
+
22
+ trait[:automap] ||= true
23
+
24
+ # Place to map the Controller to, this is something like '/' or '/foo'
25
+
26
+ trait[:map] ||= nil
27
+
28
+ # Caches patterns for the given path.
29
+
30
+ trait :pattern_cache => Hash.new{|h,k| h[k] = Controller.pattern_for(k) }
31
+
32
+ class << self
33
+ # When Controller is subclassed the resulting class is placed in
34
+ # Global.controllers and a new trait :actions_cached is set on it.
35
+
36
+ def inherited controller
37
+ controller.trait :actions_cached => {}
38
+ Global.controllers << controller
39
+ if map = controller.mapping
40
+ Log.dev("mapping #{map} => #{controller}")
41
+ Global.mapping[map] ||= controller
42
+ end
43
+ end
44
+
45
+ # called from Ramaze.startup, adds Cache.actions and Cache.patterns, walks
46
+ # all controllers subclassed so far and adds them to the Global.mapping if
47
+ # they are not assigned yet.
48
+
49
+ def startup options = {}
50
+ Log.dev("found Controllers: #{Global.controllers.inspect}")
51
+
52
+ check_path("Public root: '%s' doesn't exist", Global.public_root)
53
+ check_path("View root: '%s' doesn't exist", Global.view_root)
54
+
55
+ require 'ramaze/controller/main' if Global.mapping.empty?
56
+
57
+ Log.debug("mapped Controllers: #{Global.mapping.inspect}")
58
+ end
59
+
60
+ # checks paths for existance and logs a warning if it doesn't exist yet.
61
+
62
+ def check_path(message, *paths)
63
+ paths.each do |path|
64
+ Log.warn(message % path) unless File.directory?(path)
65
+ end
66
+ end
67
+
68
+ # if trait[:automap] is set and controller is not in Global.mapping yet
69
+ # this will build a new default mapping-point, MainController is put
70
+ # at '/' by default. For other Class names, String#snake_case is called,
71
+ # e.g. FooBarController is mapped at '/foo_bar'.
72
+
73
+ def mapping
74
+ global_mapping = Global.mapping.invert[self]
75
+
76
+ return global_mapping if global_mapping
77
+
78
+ if ancestral_trait[:automap] && self.to_s !~ /#<Class:/
79
+ name = self.to_s.gsub('Controller', '').gsub('::', '/').clone
80
+ return if name.empty?
81
+ name == 'Main' ? '/' : "/#{name.snake_case}"
82
+ end
83
+ end
84
+
85
+ # Map Controller to the given syms or strings.
86
+ # Replaces old mappings.
87
+ # If you want to _add_ a mapping, just modify Global.mapping.
88
+
89
+ def map(*syms)
90
+ Global.mapping.delete_if{|k,v| v == self}
91
+
92
+ syms.compact.each do |sym|
93
+ Global.mapping[sym.to_s] = self
94
+ end
95
+ end
96
+
97
+ # Returns the Controller at a mapped path.
98
+
99
+ def at(mapping)
100
+ Global.mapping[mapping.to_s]
101
+ end
102
+
103
+ # Define a layout for all actions on this controller
104
+ #
105
+ # Example:
106
+ # class Foo < Ramaze::Controller
107
+ # layout :foo
108
+ # end
109
+ #
110
+ # This defines the action :foo to be layout of the controller and will
111
+ # render the layout after any other action has been rendered, assigns
112
+ # @content to the result of the action and then goes on rendering
113
+ # the layout-action where @content may or may not be used, returning
114
+ # whatever the layout returns.
115
+
116
+ def layout(*meth_or_hash)
117
+ if meth_or_hash.empty?
118
+ trait[:layout] ||= ( ancestral_trait[:layout] || {:all => nil, :deny => Set.new} ).dup
119
+ else
120
+ meth_or_hash = meth_or_hash.first
121
+ if meth_or_hash.respond_to?(:to_hash)
122
+ meth_or_hash.each do |layout_name, *actions|
123
+ actions.flatten.each do |action|
124
+ layout[action.to_s] = layout_name
125
+ end
126
+ end
127
+ else
128
+ layout[:all] = meth_or_hash
129
+ end
130
+ end
131
+ end
132
+
133
+ # Deny layout for passed names of actions.
134
+ # Name should be name of the method or template without extension, as
135
+ # String or Symbol
136
+ #
137
+ # Usage:
138
+ # class MainController < Ramaze::Controller
139
+ # deny_layout :atom
140
+ #
141
+ # def atom
142
+ # "I won't have layout"
143
+ # end
144
+ # end
145
+
146
+ def deny_layout(*actions)
147
+ actions.each do |action|
148
+ layout[:deny] << action.to_s
149
+ end
150
+ end
151
+
152
+ # Define a view_root for Controller, returns the current view_root
153
+ # if no argument is given.
154
+ # Runs every given path through Controller::check_path
155
+
156
+ def view_root *args
157
+ return @view_root if args.empty?
158
+
159
+ check_path("#{self}.view_root: '%s' doesn't exist", *args)
160
+ @view_root = args.flatten
161
+ end
162
+
163
+ # This is used for template rerouting, takes action, optionally a
164
+ # controller and action to route to.
165
+ #
166
+ # Usage:
167
+ # class MainController
168
+ # template :index, OtherController, :list
169
+ # template :foo, :bar
170
+ # template :bar, :file => '/absolute/path'
171
+ # template :baz, :file => 'relative/path'
172
+ # template :abc, :controller => OtherController
173
+ # template :xyz, :controller => OtherController, :action => 'list'
174
+ #
175
+ # def index
176
+ # 'will use template from OtherController#list'
177
+ # end
178
+ #
179
+ # def foo
180
+ # 'will use template from self#bar'
181
+ # end
182
+ #
183
+ # def bar
184
+ # 'will use template from /absolute/path'
185
+ # end
186
+ #
187
+ # def baz
188
+ # 'will use template from relative/path'
189
+ # end
190
+ #
191
+ # def abc
192
+ # 'will use template from OtherController#index'
193
+ # end
194
+ #
195
+ # def xyz
196
+ # 'will use template from OtherController#list'
197
+ # end
198
+ # end
199
+
200
+ def template(this, *argv)
201
+ case argv.first
202
+ when Hash
203
+ options, *ignored = argv
204
+ controller = options[:controller] || options['controller']
205
+ action = options[:action] || options['action']
206
+ file = options[:file] || options['file']
207
+ info = {}
208
+ if file
209
+ file = file.to_s
210
+ unless Pathname(file).absolute?
211
+ root = [view_root || Global.view_root].flatten.first
212
+ file = File.join(root, file)
213
+ end
214
+ info[:file] = file
215
+ else
216
+ controller ||= self
217
+ action = (action || 'index').to_s
218
+ info[:controller] = controller
219
+ info[:action] = action
220
+ end
221
+ trait "#{this}_template" => info
222
+ else
223
+ # Only explicitly set the controller to use, if it was explicitly given.
224
+ # This helps ensure that template mappings still work in subclasses
225
+ # of this controller.
226
+ first, second, *ignored = argv
227
+ if second
228
+ trait "#{this}_template" => {:controller => first, :action => second}
229
+ else
230
+ trait "#{this}_template" => {:action => first}
231
+ end
232
+ end
233
+ end
234
+
235
+ # This is a method to specify the templating engine for your controller.
236
+ # It basically just is sugar for:
237
+ # trait :engine => Haml
238
+ #
239
+ # Usage:
240
+ # class MainController < Ramaze::Controller
241
+ # engine :Haml
242
+ # end
243
+
244
+ def engine(name)
245
+ name = Template.const_get(name)
246
+ rescue NameError => ex
247
+ Log.warn ex
248
+ Log.warn "Try to use passed engine directly"
249
+ ensure
250
+ trait :engine => name
251
+ end
252
+
253
+ # Return Controller of current Action
254
+
255
+ def current
256
+ action = Action.current
257
+ action.instance || action.controller
258
+ end
259
+
260
+ # Entering point for Dispatcher, first Controller::resolve(path) and then
261
+ # renders the resulting Action.
262
+
263
+ def handle path
264
+ action = resolve(path)
265
+ STATE[:controller] = action.controller
266
+ action.render
267
+ end
268
+
269
+ # By default, returns all ancestors of current Controller that have
270
+ # Ramaze::Controller as their ancestor. Optional argument parent
271
+ # can be used return ancestors that have parent as an ancestor.
272
+
273
+ def relevant_ancestors(parent = Ramaze::Controller)
274
+ ancestors.select do |anc|
275
+ anc.ancestors.include?(parent)
276
+ end
277
+ end
278
+ end
279
+
280
+ private
281
+
282
+ # Simplistic render, rerouting to Controller.handle(*args)
283
+
284
+ def render *args
285
+ self.class.handle(*args)
286
+ end
287
+ end
288
+ end
@@ -0,0 +1,231 @@
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
+ # the full request URI provided by Rack::Request e.g. http://localhost:7000/controller/action?foo=bar.xhtml
32
+
33
+ def request_uri
34
+ env['REQUEST_URI'] || path_info
35
+ end
36
+
37
+ # the IP address(s) making the request provided by Rack::Request. You shouldn't trust it
38
+
39
+ def ip
40
+ if addr = env['HTTP_X_FORWARDED_FOR']
41
+ addr.split(',').last.strip
42
+ else
43
+ env['REMOTE_ADDR']
44
+ end
45
+ end
46
+
47
+ # Request is from a local network?
48
+ # Checks both IPv4 and IPv6
49
+
50
+ 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 ]
51
+ ipv6 = %w[ fc00::/7 fe80::/10 fec0::/10 ::1 ]
52
+ LOCAL = (ipv4 + ipv6).map{|a| IPAddr.new(a)} unless defined?(LOCAL)
53
+
54
+ # returns true if the IP address making the request is from local network.
55
+ # Optional argument address can be used to check any IP address.
56
+
57
+ def local_net?(address = ip)
58
+ addr = IPAddr.new(address)
59
+ LOCAL.find{|range| range.include?(addr) }
60
+ rescue ArgumentError => ex
61
+ raise ArgumentError, ex unless ex.message == 'invalid address'
62
+ end
63
+
64
+ def [](key, *rest)
65
+ return params[key.to_s] if rest.empty?
66
+ [key, *rest].map{|k| params[k.to_s] }
67
+ end
68
+
69
+ # Sets any arguments passed as @instance_variables for the current action.
70
+ #
71
+ # Usage:
72
+ # request.params # => {'name' => 'manveru', 'q' => 'google', 'lang' => 'de'}
73
+ # to_ivs(:name, :q)
74
+ # @q # => 'google'
75
+ # @name # => 'manveru'
76
+ # @lang # => nil
77
+
78
+ def to_ivs(*args)
79
+ instance = Action.current.instance
80
+ args.each do |arg|
81
+ next unless value = self[arg]
82
+ instance.instance_variable_set("@#{arg}", value)
83
+ end
84
+ end
85
+
86
+ # Wrapping Request#params to support a one-level hash notation.
87
+ # It doesn't support anything really fancy, so be conservative in its use.
88
+ #
89
+ # See if following provides something useful for us:
90
+ # http://redhanded.hobix.com/2006/01/25.html
91
+ #
92
+ # Example Usage:
93
+ #
94
+ # # Template:
95
+ #
96
+ # <form action="/paste">
97
+ # <input type="text" name="paste[name]" />
98
+ # <input type="text" name="paste[syntax]" />
99
+ # <input type="submit" />
100
+ # </form>
101
+ #
102
+ # # In your Controller:
103
+ #
104
+ # def paste
105
+ # name, syntax = request['paste'].values_at('name', 'syntax')
106
+ # paste = Paste.create_with(:name => name, :syntax => syntax)
107
+ # redirect '/'
108
+ # end
109
+ #
110
+ # # Or, easier:
111
+ #
112
+ # def paste
113
+ # paste = Paste.create_with(request['paste'])
114
+ # redirect '/'
115
+ # end
116
+
117
+ def params
118
+ return {} if put?
119
+ return @ramaze_params if @ramaze_params
120
+
121
+ begin
122
+ @rack_params ||= super
123
+ rescue EOFError => ex
124
+ @rack_params = {}
125
+ Log.error(ex)
126
+ end
127
+
128
+ @ramaze_params = {}
129
+
130
+ @rack_params.each do |key, value|
131
+ if key =~ /^(.*?)(\[.*\])/
132
+ prim, nested = $~.captures
133
+ ref = @ramaze_params
134
+
135
+ keys = nested.scan(/\[([^\]]+)\]/).flatten
136
+ keys.unshift prim
137
+
138
+ keys.each_with_index do |k, i|
139
+ if i + 1 >= keys.size
140
+ ref[k] = value
141
+ else
142
+ # in case the value is a string we cannot let it be ref next
143
+ # time, so throw it away
144
+ if ref[k].is_a?(String)
145
+ ref = ref[k] = {}
146
+ else
147
+ ref = ref[k] ||= {}
148
+ end
149
+ end
150
+ end
151
+ else
152
+ @ramaze_params[key] = value
153
+ end
154
+ end
155
+
156
+ @ramaze_params
157
+ end
158
+
159
+ # Interesting HTTP variables from env
160
+
161
+ def http_vars
162
+ env.reject{ |k,v|
163
+ k.to_s !~ /USER|HOST|REQUEST|REMOTE|FORWARD|REFER|PATH|QUERY|VERSION|KEEP|CACHE/
164
+ }
165
+ end
166
+
167
+ # Returns a string presentation of the request, useful for debugging
168
+ # parameters of the action.
169
+
170
+ def to_s
171
+ p, c, e = params.inspect, cookies.inspect, http_vars.inspect
172
+ %{#<Ramaze::Request params=#{p} cookies=#{c} env=#{e}>}
173
+ end
174
+ alias inspect to_s
175
+
176
+ # Pretty prints current action with parameters, cookies and
177
+ # enviroment variables.
178
+
179
+ def pretty_print pp
180
+ p, c, e = params, cookies, http_vars
181
+ pp.object_group(self){
182
+ { 'params' => params,
183
+ 'cookies' => cookies,
184
+ 'env' => http_vars }.each do |name, hash|
185
+ pp.breakable
186
+ pp.text " @#{name}="
187
+ pp.nest(name.length+3){ pp.pp_hash hash }
188
+ end
189
+ }
190
+ end
191
+
192
+ # Answers with a subset of request.params with only the key/value pairs for
193
+ # which you pass the keys.
194
+ # Valid keys are objects that respond to :to_s
195
+ #
196
+ # Example:
197
+ # request.params
198
+ # # => {'name' => 'jason', 'age' => '45', 'job' => 'lumberjack'}
199
+ # request.subset('name')
200
+ # # => {'name' => 'jason'}
201
+ # request.subset(:name, :job)
202
+ # # => {'name' => 'jason', 'job' => 'lumberjack'}
203
+
204
+ def subset(*keys)
205
+ keys = keys.map{|k| k.to_s }
206
+ params.reject{|k,v| not keys.include?(k) }
207
+ end
208
+
209
+ # Is this an SSL request?
210
+ def ssl?
211
+ env['HTTPS'] == 'on' || env['HTTP_X_FORWARDED_PROTO'] == 'https'
212
+ end
213
+
214
+ # Returns 'https' if this is an SSL request and 'http' otherwise.
215
+ def protocol
216
+ ssl? ? 'https' : 'http'
217
+ end
218
+
219
+ def domain(path = '/')
220
+ host = env['HTTP_HOST']
221
+ URI("#{protocol}://#{host}#{path}")
222
+ end
223
+
224
+ # Returns and array of locales from env['HTTP_ACCEPT_LANGUAGE].
225
+ # e.g. ["fi", "en", "ja", "fr", "de", "es", "it", "nl", "sv"]
226
+
227
+ def locales
228
+ env['HTTP_ACCEPT_LANGUAGE'].to_s.split(/(?:,|;q=[\d.,]+)/)
229
+ end
230
+ end
231
+ end