rjspotter-ramaze 2009.06.29

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 (503) hide show
  1. data/.gitignore +3 -0
  2. data/.mailmap +25 -0
  3. data/MANIFEST +502 -0
  4. data/README.md +457 -0
  5. data/Rakefile +88 -0
  6. data/benchmark/bench_templates/bench.rb +67 -0
  7. data/benchmark/bench_templates/view/large.erb +79 -0
  8. data/benchmark/bench_templates/view/large.haml +41 -0
  9. data/benchmark/bench_templates/view/large.xhtml +79 -0
  10. data/benchmark/bench_templates/view/small.erb +21 -0
  11. data/benchmark/bench_templates/view/small.haml +12 -0
  12. data/benchmark/bench_templates/view/small.xhtml +21 -0
  13. data/benchmark/results.txt +131 -0
  14. data/benchmark/run.rb +355 -0
  15. data/benchmark/suite/minimal.rb +11 -0
  16. data/benchmark/suite/no_informer.rb +7 -0
  17. data/benchmark/suite/no_sessions.rb +9 -0
  18. data/benchmark/suite/no_template.rb +7 -0
  19. data/benchmark/suite/simple.rb +5 -0
  20. data/benchmark/suite/template_erubis.rb +8 -0
  21. data/benchmark/suite/template_etanni.rb +8 -0
  22. data/benchmark/suite/template_ezamar.rb +8 -0
  23. data/benchmark/suite/template_haml.rb +13 -0
  24. data/benchmark/suite/template_liquid.rb +11 -0
  25. data/benchmark/suite/template_markaby.rb +9 -0
  26. data/benchmark/suite/template_nagoro.rb +8 -0
  27. data/benchmark/suite/template_redcloth.rb +13 -0
  28. data/benchmark/suite/template_tenjin.rb +8 -0
  29. data/benchmark/test.rb +35 -0
  30. data/bin/ramaze +15 -0
  31. data/doc/AUTHORS +44 -0
  32. data/doc/CHANGELOG +17362 -0
  33. data/doc/COPYING +56 -0
  34. data/doc/FAQ +92 -0
  35. data/doc/GPL +339 -0
  36. data/doc/INSTALL +92 -0
  37. data/doc/LEGAL +26 -0
  38. data/doc/TODO +29 -0
  39. data/doc/meta/announcement.txt +146 -0
  40. data/doc/meta/configuration.txt +163 -0
  41. data/doc/meta/internals.txt +278 -0
  42. data/doc/meta/users.kml +64 -0
  43. data/doc/tutorial/todolist.html +1379 -0
  44. data/doc/tutorial/todolist.txt +920 -0
  45. data/examples/app/auth/layout/auth.xhtml +25 -0
  46. data/examples/app/auth/start.rb +23 -0
  47. data/examples/app/auth/view/index.xhtml +4 -0
  48. data/examples/app/auth/view/login.xhtml +20 -0
  49. data/examples/app/auth/view/secret.xhtml +1 -0
  50. data/examples/app/blog/README +3 -0
  51. data/examples/app/blog/app.rb +69 -0
  52. data/examples/app/blog/config.ru +17 -0
  53. data/examples/app/blog/controller/comment.rb +45 -0
  54. data/examples/app/blog/controller/entry.rb +85 -0
  55. data/examples/app/blog/controller/init.rb +86 -0
  56. data/examples/app/blog/controller/main.rb +20 -0
  57. data/examples/app/blog/controller/tag.rb +9 -0
  58. data/examples/app/blog/layout/default.nag +31 -0
  59. data/examples/app/blog/model/comment.rb +58 -0
  60. data/examples/app/blog/model/entry.rb +89 -0
  61. data/examples/app/blog/model/init.rb +15 -0
  62. data/examples/app/blog/model/tag.rb +36 -0
  63. data/examples/app/blog/public/css/screen.css +273 -0
  64. data/examples/app/blog/spec/blog.rb +87 -0
  65. data/examples/app/blog/start.rb +5 -0
  66. data/examples/app/blog/view/comment/form.nag +10 -0
  67. data/examples/app/blog/view/comment/show.nag +16 -0
  68. data/examples/app/blog/view/entry/edit.nag +14 -0
  69. data/examples/app/blog/view/entry/feed.atom.nag +8 -0
  70. data/examples/app/blog/view/entry/feed.rss.nag +7 -0
  71. data/examples/app/blog/view/entry/index.nag +7 -0
  72. data/examples/app/blog/view/entry/new.nag +13 -0
  73. data/examples/app/blog/view/entry/show.nag +36 -0
  74. data/examples/app/blog/view/feed.atom.nag +18 -0
  75. data/examples/app/blog/view/feed.rss.nag +25 -0
  76. data/examples/app/blog/view/index.nag +6 -0
  77. data/examples/app/blog/view/tag/index.nag +5 -0
  78. data/examples/app/chat/layout/default.xhtml +13 -0
  79. data/examples/app/chat/model/history.rb +38 -0
  80. data/examples/app/chat/model/message.rb +7 -0
  81. data/examples/app/chat/public/css/chat.css +9 -0
  82. data/examples/app/chat/public/js/chat.js +28 -0
  83. data/examples/app/chat/public/js/jquery.js +3436 -0
  84. data/examples/app/chat/start.rb +39 -0
  85. data/examples/app/chat/view/chat.xhtml +9 -0
  86. data/examples/app/chat/view/index.xhtml +7 -0
  87. data/examples/app/localization/locale/de.yaml +5 -0
  88. data/examples/app/localization/locale/en.yaml +5 -0
  89. data/examples/app/localization/locale/ja.yaml +5 -0
  90. data/examples/app/localization/start.rb +48 -0
  91. data/examples/app/sourceview/public/coderay.css +104 -0
  92. data/examples/app/sourceview/public/images/file.gif +0 -0
  93. data/examples/app/sourceview/public/images/folder.gif +0 -0
  94. data/examples/app/sourceview/public/images/tv-collapsable-last.gif +0 -0
  95. data/examples/app/sourceview/public/images/tv-collapsable.gif +0 -0
  96. data/examples/app/sourceview/public/images/tv-expandable-last.gif +0 -0
  97. data/examples/app/sourceview/public/images/tv-expandable.gif +0 -0
  98. data/examples/app/sourceview/public/images/tv-item-last.gif +0 -0
  99. data/examples/app/sourceview/public/images/tv-item.gif +0 -0
  100. data/examples/app/sourceview/public/jquery.js +11 -0
  101. data/examples/app/sourceview/public/jquery.treeview.css +48 -0
  102. data/examples/app/sourceview/public/jquery.treeview.js +223 -0
  103. data/examples/app/sourceview/public/sourceview.js +52 -0
  104. data/examples/app/sourceview/start.rb +79 -0
  105. data/examples/app/sourceview/view/index.haml +59 -0
  106. data/examples/app/todolist/controller/init.rb +10 -0
  107. data/examples/app/todolist/controller/task.rb +39 -0
  108. data/examples/app/todolist/layout/default.xhtml +14 -0
  109. data/examples/app/todolist/model/init.rb +14 -0
  110. data/examples/app/todolist/model/task.rb +39 -0
  111. data/examples/app/todolist/public/css/screen.css +63 -0
  112. data/examples/app/todolist/public/favicon.ico +0 -0
  113. data/examples/app/todolist/start.rb +11 -0
  114. data/examples/app/todolist/view/index.xhtml +29 -0
  115. data/examples/app/upload/start.rb +19 -0
  116. data/examples/app/upload/view/index.xhtml +25 -0
  117. data/examples/app/whywiki/spec/whywiki.rb +58 -0
  118. data/examples/app/whywiki/start.rb +46 -0
  119. data/examples/app/whywiki/template/edit.xhtml +14 -0
  120. data/examples/app/whywiki/template/show.xhtml +18 -0
  121. data/examples/app/wikore/spec/wikore.rb +109 -0
  122. data/examples/app/wikore/src/controller.rb +78 -0
  123. data/examples/app/wikore/src/model.rb +56 -0
  124. data/examples/app/wikore/start.rb +9 -0
  125. data/examples/app/wikore/view/index.xhtml +8 -0
  126. data/examples/app/wiktacular/README +2 -0
  127. data/examples/app/wiktacular/mkd/link/2007-07-20_19-45-51.mkd +1 -0
  128. data/examples/app/wiktacular/mkd/link/current.mkd +1 -0
  129. data/examples/app/wiktacular/mkd/main/2007-07-20_16-31-33.mkd +1 -0
  130. data/examples/app/wiktacular/mkd/main/2007-07-20_19-21-12.mkd +1 -0
  131. data/examples/app/wiktacular/mkd/main/2007-07-20_19-23-10.mkd +2 -0
  132. data/examples/app/wiktacular/mkd/main/2007-07-20_19-45-07.mkd +2 -0
  133. data/examples/app/wiktacular/mkd/main/current.mkd +2 -0
  134. data/examples/app/wiktacular/mkd/markdown/current.mkd +3 -0
  135. data/examples/app/wiktacular/mkd/testing/2007-07-20_16-43-46.mkd +2 -0
  136. data/examples/app/wiktacular/mkd/testing/2007-07-20_19-43-50.mkd +3 -0
  137. data/examples/app/wiktacular/mkd/testing/2007-07-21_18-46-01.mkd +11 -0
  138. data/examples/app/wiktacular/mkd/testing/2007-07-21_18-46-32.mkd +13 -0
  139. data/examples/app/wiktacular/mkd/testing/2007-07-21_18-47-08.mkd +17 -0
  140. data/examples/app/wiktacular/mkd/testing/2007-07-21_18-47-54.mkd +17 -0
  141. data/examples/app/wiktacular/mkd/testing/current.mkd +17 -0
  142. data/examples/app/wiktacular/public/favicon.ico +0 -0
  143. data/examples/app/wiktacular/public/screen.css +72 -0
  144. data/examples/app/wiktacular/spec/wiktacular.rb +157 -0
  145. data/examples/app/wiktacular/src/controller.rb +55 -0
  146. data/examples/app/wiktacular/src/model.rb +102 -0
  147. data/examples/app/wiktacular/start.rb +8 -0
  148. data/examples/app/wiktacular/template/edit.xhtml +6 -0
  149. data/examples/app/wiktacular/template/html_layout.xhtml +27 -0
  150. data/examples/app/wiktacular/template/index.xhtml +9 -0
  151. data/examples/app/wiktacular/template/new.xhtml +6 -0
  152. data/examples/basic/element.rb +47 -0
  153. data/examples/basic/gestalt.rb +26 -0
  154. data/examples/basic/hello.rb +14 -0
  155. data/examples/basic/layout.rb +28 -0
  156. data/examples/basic/linking.rb +29 -0
  157. data/examples/basic/partial.rb +26 -0
  158. data/examples/basic/simple.rb +52 -0
  159. data/examples/helpers/cache.rb +33 -0
  160. data/examples/helpers/form_with_sequel.rb +24 -0
  161. data/examples/helpers/httpdigest.rb +107 -0
  162. data/examples/helpers/identity.rb +18 -0
  163. data/examples/helpers/nitro_form.rb +23 -0
  164. data/examples/helpers/paginate.rb +71 -0
  165. data/examples/helpers/rest.rb +28 -0
  166. data/examples/helpers/simple_captcha.rb +29 -0
  167. data/examples/misc/css.rb +37 -0
  168. data/examples/misc/facebook.rb +159 -0
  169. data/examples/misc/memleak_detector.rb +37 -0
  170. data/examples/misc/nagoro_element.rb +43 -0
  171. data/examples/misc/ramaise.rb +132 -0
  172. data/examples/misc/rapp.rb +56 -0
  173. data/examples/misc/sequel_scaffolding.rb +34 -0
  174. data/examples/misc/serve_directory.rb +6 -0
  175. data/examples/templates/template_erubis.rb +52 -0
  176. data/examples/templates/template_ezamar.rb +51 -0
  177. data/examples/templates/template_haml.rb +49 -0
  178. data/examples/templates/template_liquid.rb +66 -0
  179. data/examples/templates/template_markaby.rb +57 -0
  180. data/examples/templates/template_nagoro.rb +50 -0
  181. data/examples/templates/template_redcloth.rb +58 -0
  182. data/examples/templates/template_remarkably.rb +54 -0
  183. data/examples/templates/template_tenjin.rb +52 -0
  184. data/examples/templates/view/external.haml +22 -0
  185. data/examples/templates/view/external.liquid +28 -0
  186. data/examples/templates/view/external.mab +30 -0
  187. data/examples/templates/view/external.nag +28 -0
  188. data/examples/templates/view/external.redcloth +19 -0
  189. data/examples/templates/view/external.rem +30 -0
  190. data/examples/templates/view/external.rhtml +28 -0
  191. data/examples/templates/view/external.tenjin +28 -0
  192. data/examples/templates/view/external.zmr +28 -0
  193. data/lib/proto/app.rb +14 -0
  194. data/lib/proto/config.ru +20 -0
  195. data/lib/proto/controller/init.rb +11 -0
  196. data/lib/proto/controller/main.rb +20 -0
  197. data/lib/proto/layout/default.xhtml +24 -0
  198. data/lib/proto/model/init.rb +4 -0
  199. data/lib/proto/public/.htaccess +24 -0
  200. data/lib/proto/public/css/screen.css +30 -0
  201. data/lib/proto/public/dispatch.fcgi +11 -0
  202. data/lib/proto/public/favicon.ico +0 -0
  203. data/lib/proto/public/js/jquery.js +4376 -0
  204. data/lib/proto/public/ramaze.png +0 -0
  205. data/lib/proto/spec/main.rb +20 -0
  206. data/lib/proto/start.rb +8 -0
  207. data/lib/proto/view/index.xhtml +41 -0
  208. data/lib/ramaze.rb +87 -0
  209. data/lib/ramaze/app.rb +124 -0
  210. data/lib/ramaze/cache.rb +19 -0
  211. data/lib/ramaze/cache/localmemcache.rb +56 -0
  212. data/lib/ramaze/cache/memcache.rb +124 -0
  213. data/lib/ramaze/cache/sequel.rb +82 -0
  214. data/lib/ramaze/contrib/addressable_route.rb +55 -0
  215. data/lib/ramaze/contrib/app_graph.rb +64 -0
  216. data/lib/ramaze/contrib/email.rb +88 -0
  217. data/lib/ramaze/contrib/facebook.rb +23 -0
  218. data/lib/ramaze/contrib/facebook/facebook.rb +171 -0
  219. data/lib/ramaze/contrib/gettext.rb +113 -0
  220. data/lib/ramaze/contrib/gettext/mo.rb +155 -0
  221. data/lib/ramaze/contrib/gettext/parser.rb +46 -0
  222. data/lib/ramaze/contrib/gettext/po.rb +109 -0
  223. data/lib/ramaze/contrib/gzip_filter.rb +1 -0
  224. data/lib/ramaze/contrib/maruku_uv.rb +59 -0
  225. data/lib/ramaze/contrib/profiling.rb +36 -0
  226. data/lib/ramaze/contrib/rest.rb +22 -0
  227. data/lib/ramaze/contrib/sequel/create_join.rb +26 -0
  228. data/lib/ramaze/contrib/sequel/form_field.rb +129 -0
  229. data/lib/ramaze/contrib/sequel/image.rb +196 -0
  230. data/lib/ramaze/contrib/sequel/relation.rb +98 -0
  231. data/lib/ramaze/controller.rb +104 -0
  232. data/lib/ramaze/controller/default.rb +12 -0
  233. data/lib/ramaze/current.rb +7 -0
  234. data/lib/ramaze/files.rb +24 -0
  235. data/lib/ramaze/gestalt.rb +132 -0
  236. data/lib/ramaze/helper.rb +13 -0
  237. data/lib/ramaze/helper/auth.rb +84 -0
  238. data/lib/ramaze/helper/bench.rb +41 -0
  239. data/lib/ramaze/helper/cache.rb +117 -0
  240. data/lib/ramaze/helper/disqus.rb +26 -0
  241. data/lib/ramaze/helper/flash.rb +62 -0
  242. data/lib/ramaze/helper/form.rb +127 -0
  243. data/lib/ramaze/helper/formatting.rb +189 -0
  244. data/lib/ramaze/helper/gestalt.rb +47 -0
  245. data/lib/ramaze/helper/gravatar.rb +79 -0
  246. data/lib/ramaze/helper/httpdigest.rb +97 -0
  247. data/lib/ramaze/helper/identity.rb +119 -0
  248. data/lib/ramaze/helper/layout.rb +97 -0
  249. data/lib/ramaze/helper/link.rb +56 -0
  250. data/lib/ramaze/helper/localize.rb +138 -0
  251. data/lib/ramaze/helper/markaby.rb +31 -0
  252. data/lib/ramaze/helper/maruku.rb +16 -0
  253. data/lib/ramaze/helper/nitroform.rb +14 -0
  254. data/lib/ramaze/helper/pager.rb +367 -0
  255. data/lib/ramaze/helper/paginate.rb +242 -0
  256. data/lib/ramaze/helper/partial.rb +100 -0
  257. data/lib/ramaze/helper/remarkably.rb +14 -0
  258. data/lib/ramaze/helper/request_accessor.rb +16 -0
  259. data/lib/ramaze/helper/sequel.rb +55 -0
  260. data/lib/ramaze/helper/sequel_form.rb +284 -0
  261. data/lib/ramaze/helper/simple_captcha.rb +61 -0
  262. data/lib/ramaze/helper/stack.rb +75 -0
  263. data/lib/ramaze/helper/tagz.rb +19 -0
  264. data/lib/ramaze/helper/thread.rb +17 -0
  265. data/lib/ramaze/helper/ultraviolet.rb +46 -0
  266. data/lib/ramaze/helper/user.rb +229 -0
  267. data/lib/ramaze/helper/xhtml.rb +34 -0
  268. data/lib/ramaze/log.rb +39 -0
  269. data/lib/ramaze/log/analogger.rb +39 -0
  270. data/lib/ramaze/log/growl.rb +38 -0
  271. data/lib/ramaze/log/hub.rb +41 -0
  272. data/lib/ramaze/log/informer.rb +129 -0
  273. data/lib/ramaze/log/knotify.rb +28 -0
  274. data/lib/ramaze/log/logger.rb +26 -0
  275. data/lib/ramaze/log/logging.rb +83 -0
  276. data/lib/ramaze/log/rotatinginformer.rb +168 -0
  277. data/lib/ramaze/log/syslog.rb +51 -0
  278. data/lib/ramaze/log/xosd.rb +92 -0
  279. data/lib/ramaze/middleware_compiler.rb +13 -0
  280. data/lib/ramaze/plugin.rb +69 -0
  281. data/lib/ramaze/reloader.rb +172 -0
  282. data/lib/ramaze/reloader/watch_inotify.rb +85 -0
  283. data/lib/ramaze/reloader/watch_stat.rb +58 -0
  284. data/lib/ramaze/request.rb +115 -0
  285. data/lib/ramaze/response.rb +36 -0
  286. data/lib/ramaze/setup.rb +123 -0
  287. data/lib/ramaze/snippets.rb +22 -0
  288. data/lib/ramaze/snippets/array/put_within.rb +44 -0
  289. data/lib/ramaze/snippets/binding/locals.rb +25 -0
  290. data/lib/ramaze/snippets/blankslate.rb +7 -0
  291. data/lib/ramaze/snippets/fiber.rb +63 -0
  292. data/lib/ramaze/snippets/kernel/pretty_inspect.rb +21 -0
  293. data/lib/ramaze/snippets/metaid.rb +17 -0
  294. data/lib/ramaze/snippets/numeric/filesize_format.rb +32 -0
  295. data/lib/ramaze/snippets/numeric/time.rb +63 -0
  296. data/lib/ramaze/snippets/object/__dir__.rb +29 -0
  297. data/lib/ramaze/snippets/object/instance_variable_defined.rb +19 -0
  298. data/lib/ramaze/snippets/object/pretty.rb +16 -0
  299. data/lib/ramaze/snippets/object/scope.rb +18 -0
  300. data/lib/ramaze/snippets/ordered_set.rb +51 -0
  301. data/lib/ramaze/snippets/proc/locals.rb +19 -0
  302. data/lib/ramaze/snippets/ramaze/acquire.rb +31 -0
  303. data/lib/ramaze/snippets/ramaze/deprecated.rb +23 -0
  304. data/lib/ramaze/snippets/ramaze/dictionary.rb +400 -0
  305. data/lib/ramaze/snippets/ramaze/fiber.rb +24 -0
  306. data/lib/ramaze/snippets/ramaze/struct.rb +45 -0
  307. data/lib/ramaze/snippets/string/camel_case.rb +21 -0
  308. data/lib/ramaze/snippets/string/color.rb +31 -0
  309. data/lib/ramaze/snippets/string/end_with.rb +20 -0
  310. data/lib/ramaze/snippets/string/esc.rb +34 -0
  311. data/lib/ramaze/snippets/string/ord.rb +21 -0
  312. data/lib/ramaze/snippets/string/snake_case.rb +21 -0
  313. data/lib/ramaze/snippets/string/start_with.rb +19 -0
  314. data/lib/ramaze/snippets/string/unindent.rb +28 -0
  315. data/lib/ramaze/snippets/thread/into.rb +18 -0
  316. data/lib/ramaze/spec.rb +33 -0
  317. data/lib/ramaze/spec/bacon.rb +34 -0
  318. data/lib/ramaze/spec/helper/bacon.rb +8 -0
  319. data/lib/ramaze/spec/helper/pretty_output.rb +82 -0
  320. data/lib/ramaze/spec/helper/snippets.rb +16 -0
  321. data/lib/ramaze/spec/helper/template_examples.rb +19 -0
  322. data/lib/ramaze/tool/bin.rb +340 -0
  323. data/lib/ramaze/tool/create.rb +48 -0
  324. data/lib/ramaze/tool/project_creator.rb +111 -0
  325. data/lib/ramaze/version.rb +3 -0
  326. data/lib/ramaze/view.rb +39 -0
  327. data/lib/ramaze/view/erubis.rb +23 -0
  328. data/lib/ramaze/view/ezamar.rb +23 -0
  329. data/lib/ramaze/view/gestalt.rb +14 -0
  330. data/lib/ramaze/view/haml.rb +16 -0
  331. data/lib/ramaze/view/liquid.rb +100 -0
  332. data/lib/ramaze/view/maruku.rb +15 -0
  333. data/lib/ramaze/view/nagoro.rb +44 -0
  334. data/lib/ramaze/view/nagoro/render_partial.rb +32 -0
  335. data/lib/ramaze/view/redcloth.rb +21 -0
  336. data/lib/ramaze/view/remarkably.rb +21 -0
  337. data/lib/ramaze/view/sass.rb +21 -0
  338. data/lib/ramaze/view/tagz.rb +63 -0
  339. data/lib/ramaze/view/tenjin.rb +32 -0
  340. data/lib/vendor/etag.rb +22 -0
  341. data/lib/vendor/route_exceptions.rb +42 -0
  342. data/ramaze.gemspec +85 -0
  343. data/spec/contrib/addressable_route.rb +32 -0
  344. data/spec/contrib/rest.rb +28 -0
  345. data/spec/examples/caching.rb +16 -0
  346. data/spec/examples/css.rb +14 -0
  347. data/spec/examples/element.rb +15 -0
  348. data/spec/examples/hello.rb +10 -0
  349. data/spec/examples/helpers/httpdigest.rb +64 -0
  350. data/spec/examples/linking.rb +17 -0
  351. data/spec/examples/simple.rb +40 -0
  352. data/spec/examples/templates/template_erubis.rb +10 -0
  353. data/spec/examples/templates/template_ezamar.rb +10 -0
  354. data/spec/examples/templates/template_haml.rb +10 -0
  355. data/spec/examples/templates/template_liquid.rb +10 -0
  356. data/spec/examples/templates/template_markaby.rb +11 -0
  357. data/spec/examples/templates/template_nagoro.rb +10 -0
  358. data/spec/examples/templates/template_redcloth.rb +10 -0
  359. data/spec/examples/templates/template_remarkably.rb +10 -0
  360. data/spec/examples/templates/template_tenjin.rb +10 -0
  361. data/spec/helper.rb +9 -0
  362. data/spec/ramaze/action/render.rb +21 -0
  363. data/spec/ramaze/action/view/bar.xhtml +1 -0
  364. data/spec/ramaze/action/view/instancevars/layout.xhtml +1 -0
  365. data/spec/ramaze/action/view/other_wrapper.erb +1 -0
  366. data/spec/ramaze/action/view/other_wrapper.xhtml +1 -0
  367. data/spec/ramaze/action/view/single_wrapper.xhtml +1 -0
  368. data/spec/ramaze/action/view/sub/sub_wrapper.erb +1 -0
  369. data/spec/ramaze/action/view/sub/sub_wrapper.xhtml +1 -0
  370. data/spec/ramaze/app.rb +47 -0
  371. data/spec/ramaze/bin/ramaze.rb +91 -0
  372. data/spec/ramaze/cache/localmemcache.rb +49 -0
  373. data/spec/ramaze/cache/memcache.rb +60 -0
  374. data/spec/ramaze/cache/sequel.rb +51 -0
  375. data/spec/ramaze/controller/actionless_templates.rb +36 -0
  376. data/spec/ramaze/controller/lonely_mapping.rb +16 -0
  377. data/spec/ramaze/controller/mapping.rb +43 -0
  378. data/spec/ramaze/controller/provide_inheritance.rb +47 -0
  379. data/spec/ramaze/controller/resolve.rb +30 -0
  380. data/spec/ramaze/controller/subclass.rb +36 -0
  381. data/spec/ramaze/controller/template_resolving.rb +77 -0
  382. data/spec/ramaze/controller/view/bar.xhtml +1 -0
  383. data/spec/ramaze/controller/view/base/another.xhtml +1 -0
  384. data/spec/ramaze/controller/view/greet.xhtml +1 -0
  385. data/spec/ramaze/controller/view/list.xhtml +1 -0
  386. data/spec/ramaze/controller/view/other/greet/other.xhtml +1 -0
  387. data/spec/ramaze/controller/view/other_wrapper.xhtml +1 -0
  388. data/spec/ramaze/dispatcher/directory.rb +69 -0
  389. data/spec/ramaze/dispatcher/file.rb +71 -0
  390. data/spec/ramaze/dispatcher/public/favicon.ico +0 -0
  391. data/spec/ramaze/dispatcher/public/file name.txt +1 -0
  392. data/spec/ramaze/dispatcher/public/test_download.css +141 -0
  393. data/spec/ramaze/error.rb +88 -0
  394. data/spec/ramaze/files.rb +29 -0
  395. data/spec/ramaze/files/public_1/plain.txt +1 -0
  396. data/spec/ramaze/files/public_2/rich.txt +1 -0
  397. data/spec/ramaze/gestalt.rb +135 -0
  398. data/spec/ramaze/helper/auth.rb +83 -0
  399. data/spec/ramaze/helper/bench.rb +18 -0
  400. data/spec/ramaze/helper/cache.rb +124 -0
  401. data/spec/ramaze/helper/flash.rb +41 -0
  402. data/spec/ramaze/helper/form.rb +356 -0
  403. data/spec/ramaze/helper/formatting.rb +111 -0
  404. data/spec/ramaze/helper/gestalt.rb +15 -0
  405. data/spec/ramaze/helper/gravatar.rb +40 -0
  406. data/spec/ramaze/helper/httpdigest.rb +144 -0
  407. data/spec/ramaze/helper/layout.rb +79 -0
  408. data/spec/ramaze/helper/layout/default.xhtml +5 -0
  409. data/spec/ramaze/helper/link.rb +70 -0
  410. data/spec/ramaze/helper/localize.rb +62 -0
  411. data/spec/ramaze/helper/maruku.rb +19 -0
  412. data/spec/ramaze/helper/pager.rb +96 -0
  413. data/spec/ramaze/helper/paginate.rb +68 -0
  414. data/spec/ramaze/helper/request_accessor.rb +19 -0
  415. data/spec/ramaze/helper/sequel_form.rb +91 -0
  416. data/spec/ramaze/helper/simple_captcha.rb +45 -0
  417. data/spec/ramaze/helper/stack.rb +86 -0
  418. data/spec/ramaze/helper/user.rb +72 -0
  419. data/spec/ramaze/helper/view/locals.xhtml +1 -0
  420. data/spec/ramaze/helper/view/loop.xhtml +4 -0
  421. data/spec/ramaze/helper/view/num.xhtml +1 -0
  422. data/spec/ramaze/helper/view/partial.xhtml +1 -0
  423. data/spec/ramaze/helper/view/recursive.xhtml +8 -0
  424. data/spec/ramaze/helper/view/recursive_local_ivars.xhtml +7 -0
  425. data/spec/ramaze/helper/view/recursive_locals.xhtml +7 -0
  426. data/spec/ramaze/helper/view/test_template.xhtml +1 -0
  427. data/spec/ramaze/helper/xhtml.rb +32 -0
  428. data/spec/ramaze/log/informer.rb +73 -0
  429. data/spec/ramaze/log/logging.rb +63 -0
  430. data/spec/ramaze/log/syslog.rb +73 -0
  431. data/spec/ramaze/params.rb +153 -0
  432. data/spec/ramaze/public/favicon.ico +0 -0
  433. data/spec/ramaze/public/ramaze.png +0 -0
  434. data/spec/ramaze/public/test_download.css +141 -0
  435. data/spec/ramaze/request.rb +61 -0
  436. data/spec/ramaze/rewrite/file.css +1 -0
  437. data/spec/ramaze/session/memcache.rb +66 -0
  438. data/spec/ramaze/struct.rb +47 -0
  439. data/spec/ramaze/template/ramaze/external.test +1 -0
  440. data/spec/ramaze/view.rb +36 -0
  441. data/spec/ramaze/view/erubis.rb +73 -0
  442. data/spec/ramaze/view/erubis/external.rhtml +8 -0
  443. data/spec/ramaze/view/erubis/sum.rhtml +1 -0
  444. data/spec/ramaze/view/ezamar.rb +73 -0
  445. data/spec/ramaze/view/ezamar/external.zmr +8 -0
  446. data/spec/ramaze/view/ezamar/sum.zmr +1 -0
  447. data/spec/ramaze/view/gestalt.rb +94 -0
  448. data/spec/ramaze/view/gestalt/external.ges +8 -0
  449. data/spec/ramaze/view/haml.rb +86 -0
  450. data/spec/ramaze/view/haml/external.haml +5 -0
  451. data/spec/ramaze/view/haml/sum.haml +2 -0
  452. data/spec/ramaze/view/liquid.rb +73 -0
  453. data/spec/ramaze/view/liquid/external.liquid +8 -0
  454. data/spec/ramaze/view/liquid/sum.liquid +1 -0
  455. data/spec/ramaze/view/nagoro.rb +73 -0
  456. data/spec/ramaze/view/nagoro/external.nag +8 -0
  457. data/spec/ramaze/view/nagoro/sum.nag +1 -0
  458. data/spec/ramaze/view/redcloth.rb +66 -0
  459. data/spec/ramaze/view/redcloth/external.redcloth +8 -0
  460. data/spec/ramaze/view/remarkably.rb +49 -0
  461. data/spec/ramaze/view/remarkably/external.rem +8 -0
  462. data/spec/ramaze/view/remarkably/sum.rem +1 -0
  463. data/spec/ramaze/view/sass.rb +73 -0
  464. data/spec/ramaze/view/sass/file.css.sass +5 -0
  465. data/spec/ramaze/view/tagz.rb +51 -0
  466. data/spec/ramaze/view/tagz/external.tagz +8 -0
  467. data/spec/ramaze/view/tagz/sum.tagz +1 -0
  468. data/spec/ramaze/view/tenjin.rb +57 -0
  469. data/spec/ramaze/view/tenjin/external.rbhtml +8 -0
  470. data/spec/ramaze/view/tenjin/sum.rbhtml +1 -0
  471. data/spec/snippets/array/put_within.rb +33 -0
  472. data/spec/snippets/binding/locals.rb +9 -0
  473. data/spec/snippets/numeric/filesize_format.rb +12 -0
  474. data/spec/snippets/numeric/time.rb +12 -0
  475. data/spec/snippets/object/__dir__.rb +14 -0
  476. data/spec/snippets/ordered_set.rb +63 -0
  477. data/spec/snippets/ramaze/acquire.rb +77 -0
  478. data/spec/snippets/ramaze/dictionary.rb +110 -0
  479. data/spec/snippets/ramaze/struct.rb +12 -0
  480. data/spec/snippets/string/camel_case.rb +25 -0
  481. data/spec/snippets/string/color.rb +11 -0
  482. data/spec/snippets/string/snake_case.rb +24 -0
  483. data/spec/snippets/string/unindent.rb +43 -0
  484. data/spec/snippets/thread/into.rb +9 -0
  485. data/tasks/authors.rake +30 -0
  486. data/tasks/bacon.rake +66 -0
  487. data/tasks/changelog.rake +20 -0
  488. data/tasks/copyright.rake +21 -0
  489. data/tasks/gem.rake +22 -0
  490. data/tasks/gem_setup.rake +99 -0
  491. data/tasks/git.rake +46 -0
  492. data/tasks/grancher.rake +12 -0
  493. data/tasks/jquery.rake +15 -0
  494. data/tasks/manifest.rake +4 -0
  495. data/tasks/metric_changes.rake +24 -0
  496. data/tasks/rcov.rake +23 -0
  497. data/tasks/release.rake +54 -0
  498. data/tasks/reversion.rake +8 -0
  499. data/tasks/setup.rake +6 -0
  500. data/tasks/todo.rake +27 -0
  501. data/tasks/traits.rake +21 -0
  502. data/tasks/yard.rake +4 -0
  503. metadata +720 -0
@@ -0,0 +1,242 @@
1
+ require 'ramaze/gestalt'
2
+
3
+ module Ramaze
4
+ module Helper
5
+
6
+ # Helper for pagination and pagination-navigation.
7
+ #
8
+ # See detailed API docs for Paginator below.
9
+ # Also have a look at the examples/helpers/paginate.rb
10
+
11
+ module Paginate
12
+ include Traited
13
+
14
+ # Define default options in your Controller, they are being retrieved by
15
+ # ancestral_trait, so you can also put it into a common superclass
16
+
17
+ trait :paginate => {
18
+ :limit => 10,
19
+ :var => 'pager',
20
+ }
21
+
22
+ # Returns a new Paginator instance.
23
+ #
24
+ # Note that the pagination relies on being inside a Ramaze request to
25
+ # gain necessary metadata about the page it resides on, you cannot use it
26
+ # outside of Ramaze yet.
27
+ #
28
+ # The examples below are meant to be used within your controller or view.
29
+ #
30
+ # Usage with Array:
31
+ # data = (1..100).to_a
32
+ # @pager = paginate(data, :limit => 30, :page => 2)
33
+ # @pager.navigation
34
+ # @pager.each{|e| puts(e) }
35
+ #
36
+ # Usage with Sequel:
37
+ # data = Article.filter(:public => true)
38
+ # @pager = paginate(data, :limit => 5)
39
+ # @pager.navigation
40
+ # @pager.each{|e| puts(e)
41
+ #
42
+ # +dataset+ may be a Sequel dataset or Array
43
+ # +options+ Takes precedence to trait[:paginate] and may contain
44
+ # following pairs:
45
+ # :limit The number of elements used when you call #each on the
46
+ # paginator
47
+ # :var The variable name being used in the request, this is helpful
48
+ # if you want to use two or more independent paginations on the
49
+ # same page.
50
+ # :page The page you are currently on, if not given it will be
51
+ # retrieved from current request variables. Defaults to 1 if
52
+ # neither exists.
53
+
54
+ def paginate(dataset, options = {})
55
+ options = ancestral_trait[:paginate].merge(options)
56
+ limit = options[:limit]
57
+ var = options[:var]
58
+ page = options[:page] || (request[var] || 1).to_i
59
+
60
+ Paginator.new(dataset, page, limit, var)
61
+ end
62
+
63
+ # Provides easy pagination and navigation
64
+
65
+ class Paginator
66
+ include Ramaze::Helper
67
+ helper :link, :cgi
68
+
69
+ def initialize(data = [], page = 1, limit = 10, var = 'pager')
70
+ @data, @page, @limit, @var = data, page, limit, var
71
+ @pager = pager_for(data)
72
+ @page = @page > page_count ? page_count : @page
73
+ @pager = pager_for(data)
74
+ end
75
+
76
+ # Returns String with navigation div.
77
+ #
78
+ # This cannot be customized very nicely, but you can style it easily
79
+ # with CSS.
80
+ #
81
+ # Output with 5 elements, page 1, limit 3:
82
+ # <div class="pager">
83
+ # <span class="first grey">&lt;&lt;</span>
84
+ # <span class="previous grey">&lt;</span>
85
+ # <a class="current" href="/index?pager=1">1</a>
86
+ # <a href="/index?pager=2">2</a>
87
+ # <a class="next" href="/index?pager=2">&gt;</a>
88
+ # <a class="last" href="/index?pager=2">&gt;&gt;</a>
89
+ # </div>
90
+ #
91
+ # Output with 5 elements, page 2, limit 3:
92
+ # <div class="pager" />
93
+ # <a class="first" href="/index?user_page=1">&lt;&lt;</a>
94
+ # <a class="previous" href="/index?user_page=1">&lt;</a>
95
+ # <a href="/index?user_page=1">1</a>
96
+ # <a class="current" href="/index?user_page=2">2</a>
97
+ # <span class="next grey">&gt;</span>
98
+ # <span class="last grey">&gt;&gt;</span>
99
+ # </div>
100
+
101
+
102
+ def navigation(limit = 8)
103
+ out = [ g.div(:class => :pager) ]
104
+
105
+ if first_page?
106
+ out << g.span(:class => 'first grey'){ h('<<') }
107
+ out << g.span(:class => 'previous grey'){ h('<') }
108
+ else
109
+ out << link(1, '<<', :class => :first)
110
+ out << link(prev_page, '<', :class => :previous)
111
+ end
112
+
113
+ lower = limit ? (current_page - limit) : 1
114
+ lower = lower < 1 ? 1 : lower
115
+
116
+ (lower...current_page).each do |n|
117
+ out << link(n)
118
+ end
119
+
120
+ out << link(current_page, current_page, :class => :current)
121
+
122
+ if last_page?
123
+ out << g.span(:class => 'next grey'){ h('>') }
124
+ out << g.span(:class => 'last grey'){ h('>>') }
125
+ elsif next_page
126
+ higher = limit ? (next_page + limit) : page_count
127
+ higher = [higher, page_count].min
128
+ (next_page..higher).each do |n|
129
+ out << link(n)
130
+ end
131
+
132
+ out << link(next_page, '>', :class => :next)
133
+ out << link(page_count, '>>', :class => :last)
134
+ end
135
+
136
+ out << '</div>'
137
+ out.join
138
+ end
139
+
140
+ # Useful to omit pager if it's of no use.
141
+
142
+ def needed?
143
+ @pager.page_count > 1
144
+ end
145
+
146
+ # these methods are actually on the pager, but we def them here for
147
+ # convenience (method_missing in helper is evil and even slower)
148
+
149
+ def page_count; @pager.page_count end
150
+ def each(&block) @pager.each(&block) end
151
+ def first_page?; @pager.first_page?; end
152
+ def prev_page; @pager.prev_page; end
153
+ def current_page; @pager.current_page; end
154
+ def last_page; @pager.last_page; end
155
+ def last_page?; @pager.last_page?; end
156
+ def next_page; @pager.next_page; end
157
+ def empty?; @pager.empty?; end
158
+ def count; @pager.count; end
159
+
160
+ private
161
+
162
+ def pager_for(obj)
163
+ @page = @page < 1 ? 1 : @page
164
+
165
+ case obj
166
+ when Array
167
+ ArrayPager.new(obj, @page, @limit)
168
+ else
169
+ obj.paginate(@page, @limit)
170
+ end
171
+ end
172
+
173
+ def link(n, text = n, hash = {})
174
+ text = h(text.to_s)
175
+
176
+ action = Current.action
177
+ params = request.params.merge(@var.to_s => n)
178
+ hash[:href] = action.node.r(action.path, params)
179
+
180
+ g.a(hash){ text }
181
+ end
182
+
183
+ def g
184
+ Ramaze::Gestalt.new
185
+ end
186
+
187
+ # Wrapper for Array to behave like the Sequel pagination
188
+
189
+ class ArrayPager
190
+ def initialize(array, page, limit)
191
+ @array, @page, @limit = array, page, limit
192
+ @page = page_count if @page > page_count
193
+ end
194
+
195
+ def size
196
+ @array.size
197
+ end
198
+
199
+ def empty?
200
+ @array.empty?
201
+ end
202
+
203
+ def page_count
204
+ pages, rest = @array.size.divmod(@limit)
205
+ rest == 0 ? pages : pages + 1
206
+ end
207
+
208
+ def current_page
209
+ @page
210
+ end
211
+
212
+ def next_page
213
+ page_count == @page ? nil : @page + 1
214
+ end
215
+
216
+ def prev_page
217
+ @page <= 1 ? nil : @page - 1
218
+ end
219
+
220
+ def first_page?
221
+ @page <= 1
222
+ end
223
+
224
+ def last_page?
225
+ page_count == @page
226
+ end
227
+
228
+ def each(&block)
229
+ from = ((@page - 1) * @limit)
230
+ to = from + @limit
231
+
232
+ a = @array[from...to] || []
233
+ a.each(&block)
234
+ end
235
+
236
+ include Enumerable
237
+ end
238
+
239
+ end
240
+ end
241
+ end
242
+ end
@@ -0,0 +1,100 @@
1
+ # Copyright (c) 2009 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
+ module Helper
6
+
7
+ # = Helper::Partial
8
+ #
9
+ # Please note that this helper is deprecated in favor of # Helper::Render,
10
+ # it has been removed from Innate and remains in Ramaze until 2009.05.
11
+ #
12
+ # === Example Usage
13
+ #
14
+ # class MyController
15
+ # def index
16
+ # end
17
+ #
18
+ # def list
19
+ # plain = request['plain']
20
+ # "Hello World from List! Plain List == #{plain}"
21
+ # end
22
+ # end
23
+ #
24
+ #
25
+ # <html>
26
+ # <head><title>Partial Render Index</title></head>
27
+ # <body>
28
+ # #{render_partial(Rs(:list), 'plain' => true)}
29
+ # </body>
30
+ # </html>
31
+ module Partial
32
+ module_function
33
+
34
+ # Renders a url 'inline'.
35
+ #
36
+ # +url+ normal URL, like you'd use for redirecting.
37
+ # +options+ optional, will be used as request parameters.
38
+ #
39
+ # Issues a mock request to the given +url+ with +options+ turned into
40
+ # query arguments.
41
+ def render_partial(url, options = {})
42
+ Ramaze.deprecated('Helper::Partial#render_partial', 'Helper::Render#render_full')
43
+
44
+ uri = URI(url)
45
+ query = options # Innate::Current.request.params.merge(options)
46
+ uri.query = Rack::Utils.build_query(query)
47
+
48
+ body = nil
49
+
50
+ Innate::Mock.session do |session|
51
+ cookie = Innate::Current.session.cookie
52
+ session.cookie = cookie
53
+ body = session.get(uri.to_s, options).body
54
+ end
55
+
56
+ body
57
+ end
58
+
59
+ # Render the template file in view_root of the
60
+ # current controller.
61
+ #
62
+ # TODO:
63
+ # * Doesn't work for absolute paths, but there are no specs for that yet.
64
+ # * the local variable hack isn't working because innate allocates a new
65
+ # binding.
66
+ # For now one can simply use instance variables, which I prefer anyway.
67
+ #
68
+ # the local binding hack:
69
+ #
70
+ # variables.each do |key, value|
71
+ # value = "ObjectSpace._id2ref(#{value.object_id})"
72
+ # eval "#{key} = #{value}", action.binding
73
+ # end
74
+
75
+ def render_template(path, variables = {})
76
+ Ramaze.deprecated('Helper::Partial#render_template')
77
+ path = path.to_s
78
+
79
+ ext = File.extname(path)
80
+ basename = File.basename(path, ext)
81
+
82
+ action = Innate::Current.action.dup
83
+ action.layout = nil
84
+ action.view = action.node.find_view(basename, 'html')
85
+ action.method = action.node.find_method(basename, action.params)
86
+
87
+ action.variables = action.variables.merge(variables)
88
+ action.sync_variables(action)
89
+
90
+ return action.call if action.valid?
91
+ raise(ArgumentError, "cannot render %p" % path)
92
+ end
93
+
94
+ def render_action(method, *params)
95
+ Ramaze.deprecated('Helper::Partial#render_action', 'Helper::Render#render_full')
96
+ render_partial(r(method), *params)
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,14 @@
1
+ require 'remarkably'
2
+
3
+ module Ramaze
4
+ module Helper
5
+ module Remarkably
6
+ include ::Remarkably::Common
7
+
8
+ # Avoid calling the Helper::Link#a method
9
+ def a(*args, &block)
10
+ method_missing(:a, *args, &block)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ module Ramaze
2
+ module Helper
3
+ module RequestAccessor
4
+ classes = [Rack::Request, Innate::Request, Ramaze::Request]
5
+ methods = classes.map{|klass| klass.instance_methods(false) }.flatten.uniq
6
+
7
+ methods.each do |method|
8
+ if method =~ /=/
9
+ eval("def %s(a) request.%s a; end" % [method, method])
10
+ else
11
+ eval("def %s(*a) request.%s(*a); end" % [method, method])
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,55 @@
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
+ module Helper::Sequel
6
+
7
+ # Very crude paginator, may contain serious bugs, please fix :)
8
+ # pass it the result of YourModel.paginate, target is where links point to.
9
+ def paginator(paginated, target)
10
+ page_count = paginated.page_count
11
+ prev_page = paginated.prev_page
12
+ current_page = paginated.current_page
13
+ next_page = paginated.next_page
14
+
15
+ lower = (current_page - 3).abs
16
+ lower = lower == 0 ? 1 : lower
17
+
18
+ out = ['<div class="paginator">']
19
+
20
+ if prev_page
21
+ out << %(<a class="paginator_prev" href="#{Rs(target, prev_page)}">&lt;&nbsp;Prev</a>)
22
+ else
23
+ out << %(<span class="paginator_prev">&lt;&nbsp;Prev</span>)
24
+ end
25
+
26
+ if current_page > 3
27
+ out << %(<a class="paginator_page" href="#{Rs(target, 1)}">#{1}</a> ... )
28
+ end
29
+
30
+ lower.upto(current_page) do |pc|
31
+ next if pc == current_page
32
+ out << %(<a class="paginator_page" href="#{Rs(target, pc)}">#{pc}</a>)
33
+ end
34
+
35
+ out << %(<span class="paginator_current">#{current_page}</span>)
36
+
37
+ current_page.upto([page_count, current_page + 3].min) do |pc|
38
+ next if pc == current_page
39
+ out << %(<a class="paginator_page" href="#{Rs(target, pc)}">#{pc}</a>)
40
+ end
41
+
42
+ if current_page < (page_count - 3)
43
+ out << %(.. <a class="paginator_page" href="#{Rs(target, page_count)}">#{page_count}</a>)
44
+ end
45
+
46
+ if next_page
47
+ out << %(<a class="paginator_next" href="#{Rs(target, next_page)}">Next&nbsp;&gt;</a>)
48
+ else
49
+ out << %(<span class="paginator_next">Next&nbsp;&gt;</span>)
50
+ end
51
+ out << '</div>'
52
+ out.join(" ")
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,284 @@
1
+ module Ramaze
2
+ module Helper
3
+ module SequelForm
4
+ # Pass it an object for your ORM and options for the <form> tag
5
+ # Usage:
6
+ # sequel_form(User, :action => '/create')
7
+ # sequel_form(Tag, :action => '/find', :method => 'post')
8
+ def sequel_form(object, options = {})
9
+ Ramaze::Form.pick(object, options)
10
+ end
11
+ end
12
+ end
13
+
14
+ class Form
15
+ attr_accessor :object, :options
16
+
17
+ YEARS, MONTHS, DAYS, HOURS, MINUTES, SECONDS =
18
+ (1900..2100), (1..12), (1..31), (0..23), (0..59), (0..59)
19
+
20
+ DATE_GENERIC = [
21
+ [ :day, DAYS ],
22
+ [ :month, MONTHS ],
23
+ [ :year, YEARS ] ]
24
+
25
+ TIME_GENERIC = [
26
+ [ :day, DAYS ],
27
+ [ :month, MONTHS ],
28
+ [ :year, YEARS ],
29
+ [ :hour, HOURS ],
30
+ [ :min, MINUTES ],
31
+ [ :sec, SECONDS ] ]
32
+
33
+ # TODO:
34
+ # How _elegant_ ...
35
+ # Tries to find the right module for extending the Form instance.
36
+ # It's problematic since the boundaries of what an model instance or model
37
+ # class looks like is very fuzzy, also a problem is that the ORM may not be
38
+ # available/required.
39
+ #
40
+ # Maybe we can abstract that a bit by going through an array of procs for
41
+ # testing?
42
+ def self.pick(object, options = {})
43
+ if defined?(Sequel::Model)
44
+ if object.is_a?(Sequel::Model)
45
+ options[:layer] ||= Layer::Sequel
46
+ InstanceForm.new(object, options)
47
+ elsif object.ancestors.include?(Sequel::Model)
48
+ options[:layer] ||= Layer::Sequel
49
+ ClassForm.new(object, options)
50
+ end
51
+ else
52
+ raise "Unknown ORM for: %p" % object
53
+ end
54
+ end
55
+
56
+ # Create new instance of Form plus the layer for the ORM
57
+ def initialize(object, options = {})
58
+ @object, @options = object, options
59
+ if layer = options.delete(:layer)
60
+ extend layer
61
+ end
62
+ end
63
+
64
+ # Generate and return the final form
65
+ def to_s
66
+ out = "<form #{form_attributes}>"
67
+ out << "<fieldset>"
68
+ out << generate
69
+ out << "</fieldset>"
70
+ out << '<input type="submit" />'
71
+ out << '<input type="reset" />'
72
+ out << "</form>"
73
+ end
74
+
75
+ # Decide on the strucuture of the tag based on the hash
76
+ def field_for(hash)
77
+ return if hash[:primary_key]
78
+ args = args_for(hash)
79
+
80
+ inner =
81
+ case type = hash[:type]
82
+ when :integer
83
+ field_integer(*args)
84
+ when :boolean
85
+ field_boolean(*args)
86
+ when :text
87
+ field_textarea(*args)
88
+ when :varchar
89
+ field_input(*args)
90
+ when :date
91
+ field_date(*args)
92
+ when :time
93
+ field_time(*args)
94
+ else
95
+ Log.warn "Unknown field: %p" % hash
96
+ field_input(*args)
97
+ end
98
+
99
+ "<label>#{args.first}: </label>\n#{inner}"
100
+ end
101
+
102
+ private
103
+
104
+ # inject to attributes for the <form>
105
+ def form_attributes
106
+ options.inject([]){|s,(k,v)| s << "#{k}='#{v}'" }.join(' ')
107
+ end
108
+
109
+ # Start tag with name and attributes
110
+ def start_tag(name, hash)
111
+ hash.inject("<#{name}"){|s,(k,v)| s << " #{k}='#{v}'" }
112
+ end
113
+
114
+ # Make a closed tag with name and attributes
115
+ def closed_tag(name, hash)
116
+ start_tag(name, hash) << ' />'
117
+ end
118
+
119
+ # Textarea with attributes from hash and the value from @object
120
+ def textarea(value, hash = {})
121
+ start_tag(:textarea, hash) << ">#{value}</textarea>"
122
+ end
123
+
124
+ # <input> with optional attributes from hash
125
+ def input(hash = {})
126
+ closed_tag(:input, hash)
127
+ end
128
+
129
+ # <input type="checkbox" with optional attributes from hash.
130
+ def checkbox(hash = {})
131
+ hash[:type] = :checkbox
132
+ input(hash)
133
+ end
134
+
135
+ # <option value="value"> with optional attributes from hash
136
+ def option(value, hash = {})
137
+ start_tag(:option, hash) << ">#{value}</option>"
138
+ end
139
+
140
+ # Yield method names and values for the Date instance
141
+ def field_date_generic
142
+ DATE_GENERIC.map{|(sel, range)|
143
+ yield(sel, range).join
144
+ }.join("\n")
145
+ end
146
+
147
+ # Yield method names and values for the Time/DateTime instance
148
+ def field_time_generic
149
+ TIME_GENERIC.map{|(sel, range)|
150
+ yield(sel, range).join
151
+ }.join("\n")
152
+ end
153
+
154
+ # Here go all the layers that are extended for specific ORMs
155
+ module Layer
156
+ # Layer for Sequel, only generate needs to be implemented, may change in
157
+ # future if we abstract more for different ORMs
158
+ module Sequel
159
+ # A bit nasty, get the @columns of the object and generate its
160
+ # field_for
161
+ def generate
162
+ columns = object_class.schema.instance_variable_get('@columns')
163
+ columns.map{|hash| field_for(hash) }.flatten.join("<br />\n")
164
+ end
165
+ end
166
+ end
167
+ end
168
+
169
+ # Form for the model class itself, very similar to an empty instance.
170
+ class ClassForm < Form
171
+ # <input name="name" />
172
+ def field_input(name)
173
+ input :name => name
174
+ end
175
+
176
+ # <textarea name="name"></textarea>
177
+ def field_textarea(name)
178
+ textarea '', :name => name
179
+ end
180
+
181
+ # <input name="name" />
182
+ def field_integer(name)
183
+ input :name => name
184
+ end
185
+
186
+ # <input type="checkbox" name="name" />
187
+ def field_boolean(name)
188
+ checkbox :name => name
189
+ end
190
+
191
+ # <select> with lots of <option>s
192
+ def field_date(name)
193
+ field_date_generic{|sel, range|
194
+ [ "<select name='#{name}[#{sel}]'>",
195
+ range.map{|d| option(d, :value => d) },
196
+ "</select>" ]
197
+ }
198
+ end
199
+
200
+ # <select> with lots of <option>s
201
+ def field_time(name)
202
+ field_time_generic{|sel, range|
203
+ [ "<select name='#{name}[#{sel}]'>",
204
+ range.map{|d| option(d, :value => d) },
205
+ "</select>" ]
206
+ }
207
+ end
208
+
209
+ # picks the :name
210
+ def args_for(hash)
211
+ [ hash[:name] ]
212
+ end
213
+
214
+ # Should be that way, at least for Sequel
215
+ def object_class
216
+ @object
217
+ end
218
+ end
219
+
220
+ # Form for instances of the model class
221
+ class InstanceForm < Form
222
+ # returns <input type='text' name='name' value='value' />
223
+ def field_input(name, value)
224
+ "<input type='text' name='#{name}' value='#{value}'/>"
225
+ end
226
+
227
+ # returns <textarea name='name'>#{value}</textarea>
228
+
229
+ def field_textarea(name, value)
230
+ "<textarea name='#{name}'>#{value}</textarea>"
231
+ end
232
+
233
+ # returns <input type="text" name="name" value="value" />
234
+
235
+ def field_integer(name, value)
236
+ field_input(name, value)
237
+ end
238
+
239
+ # <input type="checkbox" ...
240
+ def field_boolean(name, value)
241
+ if value
242
+ checkbox :name => name, :value => value, :checked => :checked
243
+ else
244
+ checkbox :name => name, :value => value
245
+ end
246
+ end
247
+
248
+ def field_date(name, value)
249
+ field_date_generic do |sel, range|
250
+ [ "<select name='#{name}[#{sel}]'>",
251
+ option_range_selected(range, value.send(sel)),
252
+ "</select>" ]
253
+ end
254
+ end
255
+
256
+ def field_time(name, value)
257
+ field_time_generic do |sel, range|
258
+ [ "<select name='#{name}[#{sel}]'>",
259
+ option_range_selected(range, value.send(sel)),
260
+ "</select>" ]
261
+ end
262
+ end
263
+
264
+ def option_range_selected(range, value)
265
+ range.map do |r|
266
+ if r == value
267
+ option(r, :value => r, :selected => :selected)
268
+ else
269
+ option(r, :value => r)
270
+ end
271
+ end
272
+ end
273
+
274
+ def args_for(hash)
275
+ name = hash[:name]
276
+ [ name, @object.send(name) ]
277
+ end
278
+
279
+ # Class for @object, atm Sequel specific?
280
+ def object_class
281
+ @object.class
282
+ end
283
+ end
284
+ end