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,48 @@
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 Dispatcher
6
+
7
+ # This dispatcher is responsible for relaying requests to Controller::handle
8
+ # and filtering the results using FILTER.
9
+
10
+ class Action
11
+
12
+ # The response is passed to each filter by sending .call(response) to it.
13
+
14
+ FILTER = OrderedSet[
15
+ # Ramaze::Tool::Localize,
16
+ ] unless defined?(FILTER)
17
+
18
+ class << self
19
+ include Trinity
20
+
21
+ # Takes path, asks Controller to handle it and builds a response on
22
+ # success. The response is then passed to each member of FILTER for
23
+ # post-processing.
24
+
25
+ def call(path)
26
+ log(path)
27
+
28
+ catch(:respond) {
29
+ response.write Controller.handle(path)
30
+ }
31
+
32
+ FILTER.each{|f| f.call(response)}
33
+ response
34
+ rescue Ramaze::Error => ex
35
+ ex
36
+ end
37
+
38
+ def log(path)
39
+ case path
40
+ when *Global.boring
41
+ else
42
+ Log.info("Dynamic request from #{request.ip}: #{request.request_uri}")
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,119 @@
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 Dispatcher
6
+
7
+ # Generates a directory listing, see Ramaze::Controller::Directory for more
8
+ # information and how to create your own directory listing page
9
+ class Directory
10
+ class << self
11
+
12
+ # Entry point from Dispatcher::filter.
13
+ # Just a forwarder to build_listing, automatticly exiting if there is
14
+ # an error (defined by returning false in build_listing)
15
+ def call(path)
16
+ if Global.list_directories
17
+ response = build_listing(path)
18
+ Response.current.build(*response) if response
19
+ end
20
+ end
21
+
22
+ # Makes a request for http://yourserver/dirlist/path and returns the
23
+ # result. Due to this method, you can overwrite the action and create your
24
+ # own page. See Ramaze::Controller::Directory for more.
25
+ def build_listing(path)
26
+ dir = ::File.expand_path(Global.public_root/::File.expand_path(path, '/'))
27
+
28
+ if ::File.directory?(dir)
29
+ Log.debug("Serving directory listing: #{dir}")
30
+ Session.current.drop! if Session.current
31
+
32
+ status = Ramaze::STATUS_CODE['OK']
33
+ header = {'Content-Type' => "text/html"}
34
+ body = list_for(dir)
35
+ [body, status, header]
36
+ end
37
+ end
38
+
39
+ # Nicely formatted listing for given path, template is "stolen" from
40
+ # lighttpd
41
+ def list_for(path)
42
+ root = ::File.expand_path(Global.public_root)
43
+ display = path.gsub(/^#{Regexp.escape(root)}\/?/, '/')
44
+ wrapper =
45
+ %(<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
46
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
47
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
48
+ <head>
49
+ <title>Directory listing of #{display}</title>
50
+
51
+ <style type="text/css"> /*<![CDATA[*/ a, a:active {text-decoration: none; color: blue;} a:visited {color: #48468F;} a:hover, a:focus {text-decoration: underline; color: red;} body {background-color: #F5F5F5;} h2 {margin-bottom: 12px;} table {margin-left: 12px;} th, td { font-family: "Courier New", Courier, monospace; font-size: 10pt; text-align: left;} th { font-weight: bold; padding-right: 14px; padding-bottom: 3px;} td {padding-right: 14px;} td.s, th.s {text-align: right;} div.list { background-color: white; border-top: 1px solid #646464; border-bottom: 1px solid #646464; padding-top: 10px; padding-bottom: 14px;} div.foot { font-family: "Courier New", Courier, monospace; font-size: 10pt; color: #787878; padding-top: 4px;} /*]]>*/ </style>
52
+ </head>
53
+ <body>
54
+ <h2>Directory listing of #{display}</h2>
55
+ <div class="list">
56
+ <table summary="Directory Listing" cellpadding="0" cellspacing="0">
57
+ <thead>
58
+ <tr>
59
+ <th class="n">Name</th>
60
+ <th class="m">Last Modified</th>
61
+ <th class="s">Size</th>
62
+ <th class="t">Type</th>
63
+ </tr>
64
+ </thead>
65
+ <tbody>
66
+ <tr>
67
+ <td class="n"><a href="#{display/'..'}/">Parent Directory</a>/</td>
68
+ <td class="m">&nbsp;</td>
69
+ <td class="s">- &nbsp;</td>
70
+ <td class="t">Directory</td>
71
+ </tr>
72
+ %s
73
+ %s
74
+ </tbody>
75
+ </table>
76
+ </div>
77
+ <div class="foot">%s</div>
78
+ </body>
79
+ </html>
80
+ )
81
+
82
+ dirs, files = Dir[path/'*'].partition{|file| ::File.directory?(file) }
83
+ dir_body, file_body = [], []
84
+
85
+ dirs.sort.each do |dir|
86
+ basename = ::File.basename(dir)
87
+ dir_body << %[<tr>
88
+ <td class="n"><a href="#{display/basename}">#{basename}/</a></td>
89
+ <td class="m">&nbsp;</td>
90
+ <td class="s">- &nbsp;</td>
91
+ <td class="t">Directory</td>
92
+ </tr>]
93
+ end
94
+
95
+ time_format = "%Y-%b-%d %H:%M:%S"
96
+ files.sort.each do |file|
97
+ basename = ::File.basename(file)
98
+ time = ::File.mtime(file).strftime(time_format)
99
+ size = ::File.size(file).filesize_format
100
+ mime = Tool::MIME.type_for(file)
101
+ file_body << %[<tr>
102
+ <td class="n"><a href="#{display/basename}">#{basename}</a></td>
103
+ <td class="m">#{time}</td>
104
+ <td class="s">#{size}</td>
105
+ <td class="t">#{mime}</td>
106
+ </tr>]
107
+ end
108
+
109
+ version = "ramaze/#{Ramaze::VERSION}"
110
+ wrapper % [
111
+ dir_body. join("\n "),
112
+ file_body.join("\n "),
113
+ version
114
+ ]
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,108 @@
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 Dispatcher
6
+
7
+ # Last resort dispatcher, tries to recover as much information as possible
8
+ # from the past request and takes the appropiate actions.
9
+ #
10
+ # You can configure it over the HANDLE_ERROR constant or by defining error
11
+ # actions in your controllers.
12
+
13
+ class Error
14
+
15
+ # The class of exception is matched when an error occurs and the status
16
+ # code is set. The absolute URLs are used as fallback in case of a total
17
+ # failure.
18
+ HANDLE_ERROR = {
19
+ Exception => [ 500, '/error' ],
20
+ Ramaze::Error::NoAction => [ 404, '/error' ],
21
+ Ramaze::Error::NoController => [ 404, '/error' ],
22
+ }
23
+
24
+ class << self
25
+ trait :last_error => nil
26
+
27
+ # Takes exception, of metainfo only :controller is used at the moment.
28
+ # Then goes on to try and find the correct response status and path.
29
+ # In case metainfo has a controller we try to get the action for the
30
+ # path on it, dispatching there if we find one.
31
+ # Otherwise a plain-text error message is set as response.
32
+ def call(error, metainfo = {})
33
+ log_error(error)
34
+
35
+ STATE[:exception] = error
36
+ response = Response.current
37
+
38
+ key = error.class.ancestors.find{|a| HANDLE_ERROR[a]}
39
+ status, path = *HANDLE_ERROR[key || Exception]
40
+ status ||= 500
41
+
42
+ if controller = metainfo[:controller]
43
+ newpath = (controller.mapping + path).squeeze('/')
44
+ action_response = Dispatcher::Action.call(newpath)
45
+ case action_response
46
+ when Ramaze::Error
47
+ Log.debug("No custom error page found on #{controller}, going to #{path}")
48
+ else
49
+ action_response.status = status
50
+ return action_response
51
+ end
52
+ end
53
+
54
+ if path and error.message !~ /`#{path}'/
55
+ response.status = status
56
+ return Dispatcher.dispatch_to(path)
57
+ else
58
+ response.build(error.message, status)
59
+ end
60
+ rescue Object => ex
61
+ Log.error(ex)
62
+ begin
63
+ m = ex.message
64
+ c = ex.class
65
+ b = [ex.backtrace].flatten.join("\n")
66
+ body = <<-html
67
+ ==== Error ====\n
68
+ #{ m } (#{ c })
69
+ #{ b }\n
70
+ ==== Request ====\n
71
+ #{ Request.current.pretty }\n
72
+ ==== Request ====\n
73
+ #{ Response.current.pretty }\n
74
+ ==== Session ====\n
75
+ #{ Session.current.pretty }\n
76
+ ==== Global ====\n
77
+ #{ Global.pretty }\n
78
+ html
79
+ response['Content-Type'] = 'text/plain'
80
+ response.build(body.unindent, status)
81
+ rescue Object
82
+ raise
83
+ end
84
+ end
85
+
86
+ # Only logs new errors with full backtrace, repeated errors are shown
87
+ # only with their message.
88
+ def log_error error
89
+ error_message = error.message
90
+
91
+ if trait[:last_error] == error_message or error.is_a? Ramaze::Error::NoAction
92
+ Log.error(error_message)
93
+ else
94
+ trait[:last_error] = error_message
95
+ Log.error(error)
96
+ end
97
+ end
98
+
99
+ # Handle to current exception.
100
+ # Only works inside request/response cycle.
101
+ def current
102
+ STATE[:exception]
103
+ end
104
+
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,95 @@
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 "time"
5
+ require 'digest/md5'
6
+
7
+ module Ramaze
8
+ class Dispatcher
9
+
10
+ # First of the dispatchers, looks up the public path and serves the
11
+ # file if found.
12
+
13
+ class File
14
+ # These names are checked for serving from public directory.
15
+ # They take priority over Actions which comes later in the FILTER
16
+ INDICES = %w[index.htm index.xhtml index.html index]
17
+
18
+ class << self
19
+ include Trinity
20
+
21
+ # Entry point from Dispatcher::filter.
22
+ # searches for the file and builds a response with status 200 if found.
23
+
24
+ def call(path)
25
+ return unless file = open_file(Rack::Utils.unescape(path))
26
+ Session.current.drop! if Session.current
27
+ if file == :NotModified
28
+ return response.build([], STATUS_CODE['Not Modified'])
29
+ end
30
+ response.build(file, STATUS_CODE['OK'])
31
+ end
32
+
33
+ # returns file-handle with the open file on success, setting the
34
+ # Content-Type as found in Tool::MIME
35
+
36
+ def open_file(path)
37
+ file = resolve_path(path)
38
+
39
+ if ::File.file?(file)
40
+ return unless in_public?(file)
41
+ response['Content-Type'] = Tool::MIME.type_for(file) unless ::File.extname(file).empty?
42
+ mtime = ::File.mtime(file)
43
+ response['Last-Modified'] = mtime.httpdate
44
+ response['ETag']= Digest::MD5.hexdigest(file+mtime.to_s).inspect
45
+ if modified_since = request.env['HTTP_IF_MODIFIED_SINCE']
46
+ return :NotModified unless Time.parse(modified_since) < mtime
47
+ elsif match = request.env['HTTP_IF_NONE_MATCH']
48
+ # Should be a unique string enclosed in ""
49
+ # To avoiding more file reading we use mtime and filepath
50
+ # we could throw in inode and size for more uniqueness
51
+ return :NotModified if response['ETag']==match
52
+ end
53
+ log(file)
54
+ ::File.open(file, 'rb')
55
+ end
56
+ end
57
+
58
+ # If path matches a directory in public_root, return that directory path, unless
59
+ # there is an index file in that directory, in which case return path for that.
60
+ # If path is not a directory, simply return given path in public_root.
61
+ # Either way, the returned path always starts with public_root.
62
+
63
+ def resolve_path(path)
64
+ joined = ::File.join(Global.public_root, path)
65
+
66
+ if ::File.directory?(joined)
67
+ Dir[joined/"{#{INDICES.join(',')}}"].first || joined
68
+ else
69
+ joined
70
+ end
71
+ end
72
+
73
+ # Determine whether a path is in the public directory for better
74
+ # security.
75
+ def in_public?(path)
76
+ expand(path).start_with?(expand(Global.public_root))
77
+ end
78
+
79
+ private
80
+
81
+ def expand(path)
82
+ ::File.expand_path(path)
83
+ end
84
+
85
+ def log(file)
86
+ case file
87
+ when *Global.boring
88
+ else
89
+ Log.debug("Serving static: #{file}")
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,145 @@
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/error'
5
+ require 'ramaze/tool/mime'
6
+
7
+ require 'ramaze/dispatcher/action'
8
+ require 'ramaze/dispatcher/error'
9
+ require 'ramaze/dispatcher/file'
10
+ require 'ramaze/dispatcher/directory'
11
+
12
+ module Ramaze
13
+
14
+ # The Dispatcher receives requests from adapters and sets up the proper environment
15
+ # to process them and respond.
16
+
17
+ class Dispatcher
18
+ def initialize(*args)
19
+ Dispatcher.call(*args)
20
+ end
21
+
22
+ # requests are passed to every
23
+ FILTER = OrderedSet[ Dispatcher::File, Dispatcher::Action ]
24
+
25
+ # Response codes to cache the output of for repeated requests.
26
+ trait :shielded => [ STATUS_CODE["Not Found"] ]
27
+
28
+ class << self
29
+ include Trinity
30
+
31
+ # Entry point for Adapter#respond, takes a Rack::Request and
32
+ # Rack::Response, sets up the environment and the goes on to dispatch
33
+ # for the given path from rack_request.
34
+ #
35
+ # +env+ will be ignored, it's just for compatibility with rack middleware
36
+ def call(env = nil)
37
+ path = request.path_info.squeeze('/')
38
+ path.sub!(/^#{Regexp.escape(Global.prefix)}/, '/')
39
+ path.squeeze!('/')
40
+
41
+ if new_path = Rewrite.resolve(path)
42
+ path = new_path
43
+ Log.dev("Rewriting `#{path}' to `#{path}'")
44
+ end
45
+
46
+ case path
47
+ when *Global.ignore
48
+ unless ::File.exist?(Dispatcher::File.resolve_path(path))
49
+ return response.build(Global.ignore_body, Global.ignore_status)
50
+ end
51
+ end
52
+
53
+ general_dispatch path
54
+ rescue Object => exception
55
+ error(exception)
56
+ end
57
+ alias handle call
58
+
59
+ # protects against recursive dispatch and reassigns the path_info in the
60
+ # request, the rest of the request is kept intact.
61
+ def dispatch_to(path)
62
+ if request.path_info == path
63
+ if error = STATE[:exception]
64
+ raise error
65
+ else
66
+ raise "Recursive redirect from #{path} to #{path}"
67
+ end
68
+ end
69
+ request.path_info = path
70
+ general_dispatch path
71
+ end
72
+
73
+ # splits up the dispatch based on Global.shield
74
+ def general_dispatch(path)
75
+ if Global.shield
76
+ shielded_dispatch path
77
+ else
78
+ dispatch path
79
+ end
80
+ end
81
+
82
+ # Protects somewhat against hammering of erroring paths, since error-pages
83
+ # take a while to build in the default mode it is possible to decrease
84
+ # overall speed quite a bit by hitting Ramaze with such paths.
85
+ # shielded_dispatch checks the path and caches erronous responses so they
86
+ # won't be recreated but simply pushed out again without stopping at the
87
+ # Controller.
88
+ # Please note that this is just minor protection and the best option is to
89
+ # create a performant error-page instead.
90
+ def shielded_dispatch(path)
91
+ shield_cache = Cache.shield
92
+ handled = shield_cache[path]
93
+ return handled if handled
94
+
95
+ dispatched = dispatch(path)
96
+
97
+ unless trait[:shielded].include?(dispatched.status)
98
+ dispatched
99
+ else
100
+ shield_cache[path] = dispatched
101
+ end
102
+ end
103
+
104
+ # filters the path until a response or redirect is thrown or a filter is
105
+ # successful, builds a response from the returned hash in case of throws.
106
+ def dispatch(path)
107
+ catch(:respond){
108
+ redirected = catch(:redirect){
109
+ filter(path)
110
+ throw(:respond)
111
+ }
112
+ response.build(*redirected)
113
+ }
114
+ end
115
+
116
+ # Calls .call(path) on every object in Dispatcher::FILTER until one
117
+ # returns something else than false/nil.
118
+
119
+ def filter(path)
120
+ result = nil
121
+ FILTER.each do |dispatcher|
122
+ result = dispatcher.call(path)
123
+ return result if result and not result.respond_to?(:exception)
124
+ end
125
+
126
+ error(result, :path => path)
127
+ end
128
+
129
+ def error(obj, meta = {})
130
+ controller = STATE[:controller]
131
+ meta[:controller] ||= controller if controller
132
+
133
+ if Global.error_page
134
+ Dispatcher::Error.call(obj, meta)
135
+ else
136
+ message = "No action for '#{meta[:path]}'"
137
+ message << " on '#{Rack::Utils.escape_html(controller)}'" if controller
138
+
139
+ raise(obj) if obj.respond_to?(:message)
140
+ raise(Ramaze::Error, message)
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,24 @@
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
+
6
+ # The general Namespace for Ramazes Errorclasses
7
+
8
+ class Error < StandardError
9
+ # No action found on Controller
10
+ class NoAction < Error; end
11
+
12
+ # No Controller found for request
13
+ class NoFilter < Error; end
14
+
15
+ # No Controller found for request
16
+ class NoController < Error; end
17
+
18
+ # Wrong parameter count for action
19
+ class WrongParameterCount < Error; end
20
+
21
+ # Error while transformation in template
22
+ class Template < Error; end
23
+ end
24
+ end
@@ -0,0 +1,124 @@
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 rdoc
5
+ Example:
6
+
7
+ require 'ramaze'
8
+ require 'ramaze/gestalt'
9
+
10
+ page = Ramaze::Gestalt.build{
11
+ title = 'Hello, World!'
12
+
13
+ html do
14
+ head{ title(title) }
15
+ body do
16
+ h1(title)
17
+ p 'I count to 10'
18
+ ('1'..'10').each do |count|
19
+ div(:style => 'width: 25px; height: 25px'){ count }
20
+ end
21
+ end
22
+ end
23
+ }
24
+ =end
25
+
26
+ module Ramaze
27
+
28
+ # Gestalt is the custom HTML/XML builder for Ramaze, based on a very simple
29
+ # DSL it will build your markup.
30
+
31
+ class Gestalt
32
+ attr_accessor :out
33
+
34
+ # The default way to start building your markup.
35
+ # Takes a block and returns the markup.
36
+ #
37
+ # Example:
38
+ # html =
39
+ # Gestalt.build do
40
+ # html do
41
+ # head do
42
+ # title "Hello, World!"
43
+ # end
44
+ # body do
45
+ # h1 "Hello, World!"
46
+ # end
47
+ # end
48
+ # end
49
+ #
50
+
51
+ def self.build(&block)
52
+ self.new(&block).to_s
53
+ end
54
+
55
+ # Gestalt.new is like ::build but will return itself.
56
+ # you can either access #out or .to_s it, which will
57
+ # return the actual markup.
58
+ #
59
+ # Useful for distributed building of one page.
60
+
61
+ def initialize(&block)
62
+ @out = []
63
+ instance_eval(&block) if block_given?
64
+ end
65
+
66
+ # catching all the tags. passing it to _gestalt_build_tag
67
+
68
+ def method_missing(meth, *args, &block)
69
+ _gestalt_call_tag meth, args, &block
70
+ end
71
+
72
+ # workaround for Kernel#p to make <p /> tags possible.
73
+
74
+ def p(*args, &block)
75
+ _gestalt_call_tag :p, args, &block
76
+ end
77
+
78
+ def _gestalt_call_tag(name, args, &block)
79
+ if args.size == 1 and args[0].kind_of? Hash
80
+ # args are just attributes, children in block...
81
+ _gestalt_build_tag name, args[0], &block
82
+ else
83
+ # no attributes, but text
84
+ _gestalt_build_tag name, {}, args, &block
85
+ end
86
+ end
87
+
88
+ # build a tag for `name`, using `args` and an optional block that
89
+ # will be yielded
90
+
91
+ def _gestalt_build_tag(name, attr = {}, text = [])
92
+ @out << "<#{name}"
93
+ @out << attr.map{|k,v| %[ #{k}="#{_gestalt_escape_entities(v)}"] }.join
94
+ if text != [] or block_given?
95
+ @out << ">"
96
+ @out << _gestalt_escape_entities([text].join)
97
+ if block_given?
98
+ text = yield
99
+ @out << text.to_str if text != @out and text.respond_to?(:to_str)
100
+ end
101
+ @out << "</#{name}>"
102
+ else
103
+ @out << ' />'
104
+ end
105
+ end
106
+
107
+ def _gestalt_escape_entities(s)
108
+ s.to_s.gsub(/&/, '&amp;').
109
+ gsub(/"/, '&quot;').
110
+ gsub(/'/, '&apos;').
111
+ gsub(/</, '&lt;').
112
+ gsub(/>/, '&gt;')
113
+ end
114
+
115
+ def tag(name, *args, &block)
116
+ _gestalt_call_tag(name.to_s, args, &block)
117
+ end
118
+
119
+ def to_s
120
+ @out.join
121
+ end
122
+ alias to_str to_s
123
+ end
124
+ end