ramaze 0.3.9.1 → 2023.01.06

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 (781) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +3 -0
  3. data/README.md +125 -0
  4. data/Rakefile +13 -186
  5. data/bin/ramaze +4 -149
  6. data/examples/app/auth/layout/auth.xhtml +25 -0
  7. data/examples/app/auth/start.rb +25 -0
  8. data/examples/app/auth/view/index.xhtml +4 -0
  9. data/examples/app/auth/view/login.xhtml +20 -0
  10. data/examples/app/auth/view/secret.xhtml +1 -0
  11. data/examples/app/blog/app.rb +23 -0
  12. data/examples/app/blog/config.ru +19 -0
  13. data/examples/app/blog/controller/init.rb +30 -0
  14. data/examples/app/blog/controller/posts.rb +223 -0
  15. data/examples/app/blog/controller/users.rb +152 -0
  16. data/examples/app/blog/layout/default.xhtml +61 -0
  17. data/examples/app/blog/migrations/01_create_schema.rb +50 -0
  18. data/examples/app/blog/model/comment.rb +42 -0
  19. data/examples/app/blog/model/init.rb +44 -0
  20. data/examples/app/blog/model/post.rb +33 -0
  21. data/examples/app/blog/model/user.rb +100 -0
  22. data/examples/app/blog/public/css/grid.css +107 -0
  23. data/examples/app/blog/public/css/layout.css +203 -0
  24. data/examples/app/blog/public/css/reset.css +123 -0
  25. data/examples/app/blog/public/css/text.css +109 -0
  26. data/examples/app/blog/public/dispatch.fcgi +11 -0
  27. data/examples/app/blog/public/favicon.ico +0 -0
  28. data/examples/app/blog/public/images/bg.png +0 -0
  29. data/examples/app/blog/start.rb +20 -0
  30. data/examples/app/blog/view/feed.xhtml +23 -0
  31. data/examples/app/blog/view/form.xhtml +11 -0
  32. data/examples/app/blog/view/index.xhtml +44 -0
  33. data/examples/app/blog/view/users/form.xhtml +12 -0
  34. data/examples/app/blog/view/users/index.xhtml +30 -0
  35. data/examples/app/blog/view/users/login.xhtml +8 -0
  36. data/examples/app/blog/view/view.xhtml +68 -0
  37. data/examples/app/chat/layout/default.xhtml +13 -0
  38. data/examples/app/chat/model/history.rb +38 -0
  39. data/examples/app/chat/model/message.rb +7 -0
  40. data/examples/app/chat/public/css/chat.css +9 -0
  41. data/examples/app/chat/public/js/chat.js +28 -0
  42. data/{lib/proto → examples/app/chat}/public/js/jquery.js +75 -15
  43. data/examples/app/chat/start.rb +39 -0
  44. data/examples/app/chat/view/chat.xhtml +9 -0
  45. data/examples/app/chat/view/index.xhtml +7 -0
  46. data/examples/app/localization/locale/de.yaml +5 -0
  47. data/examples/app/localization/locale/en.yaml +5 -0
  48. data/examples/app/localization/locale/ja.yaml +5 -0
  49. data/examples/app/localization/start.rb +48 -0
  50. data/examples/app/todolist/controller/init.rb +11 -0
  51. data/examples/app/todolist/controller/task.rb +39 -0
  52. data/examples/app/todolist/layout/default.xhtml +14 -0
  53. data/examples/app/todolist/model/init.rb +14 -0
  54. data/examples/app/todolist/model/task.rb +39 -0
  55. data/examples/app/todolist/public/css/screen.css +63 -0
  56. data/examples/app/todolist/start.rb +7 -0
  57. data/examples/app/todolist/view/index.xhtml +29 -0
  58. data/examples/{upload → app/upload}/start.rb +7 -3
  59. data/examples/app/whywiki/spec/whywiki.rb +56 -0
  60. data/examples/{whywiki → app/whywiki}/start.rb +10 -9
  61. data/examples/{whywiki/template → app/whywiki/view}/edit.xhtml +2 -2
  62. data/examples/app/whywiki/view/show.xhtml +20 -0
  63. data/examples/{wikore → app/wikore}/spec/wikore.rb +7 -9
  64. data/examples/{wikore → app/wikore}/src/controller.rb +9 -11
  65. data/examples/{wikore → app/wikore}/src/model.rb +11 -13
  66. data/examples/app/wikore/start.rb +9 -0
  67. data/examples/{wiktacular/template/html_layout.xhtml → app/wiktacular/layout/application.xhtml} +1 -1
  68. data/examples/{wiktacular → app/wiktacular}/mkd/main/2007-07-20_19-21-12.mkd +1 -1
  69. data/examples/app/wiktacular/mkd/main/2007-07-20_19-23-10.mkd +2 -0
  70. data/examples/app/wiktacular/mkd/main/2007-07-20_19-45-07.mkd +2 -0
  71. data/examples/app/wiktacular/mkd/main/current.mkd +2 -0
  72. data/examples/{wiktacular → app/wiktacular}/mkd/markdown/current.mkd +2 -2
  73. data/examples/app/wiktacular/mkd/testing/2007-07-20_16-43-46.mkd +2 -0
  74. data/examples/{wiktacular → app/wiktacular}/mkd/testing/2007-07-20_19-43-50.mkd +2 -2
  75. data/examples/{wiktacular → app/wiktacular}/mkd/testing/2007-07-21_18-46-01.mkd +11 -11
  76. data/examples/{wiktacular → app/wiktacular}/mkd/testing/2007-07-21_18-46-32.mkd +12 -12
  77. data/examples/{wiktacular → app/wiktacular}/mkd/testing/2007-07-21_18-47-08.mkd +16 -16
  78. data/examples/{wiktacular → app/wiktacular}/mkd/testing/2007-07-21_18-47-54.mkd +16 -16
  79. data/examples/{wiktacular → app/wiktacular}/mkd/testing/current.mkd +16 -16
  80. data/examples/{wiktacular → app/wiktacular}/spec/wiktacular.rb +39 -40
  81. data/examples/{wiktacular → app/wiktacular}/src/controller.rb +18 -18
  82. data/examples/{wiktacular → app/wiktacular}/src/model.rb +30 -14
  83. data/examples/{wiktacular → app/wiktacular}/start.rb +1 -1
  84. data/examples/{wiktacular/template → app/wiktacular/view}/edit.xhtml +2 -2
  85. data/examples/{wiktacular/template → app/wiktacular/view}/new.xhtml +1 -1
  86. data/examples/{element.rb → basic/element.rb} +5 -3
  87. data/examples/basic/gestalt.rb +26 -0
  88. data/examples/basic/hello.rb +14 -0
  89. data/examples/{layout.rb → basic/layout.rb} +2 -2
  90. data/examples/basic/linking.rb +29 -0
  91. data/examples/basic/partial.rb +26 -0
  92. data/examples/{simple.rb → basic/simple.rb} +9 -12
  93. data/examples/{caching.rb → helpers/cache.rb} +9 -7
  94. data/examples/helpers/paginate.rb +71 -0
  95. data/examples/helpers/rest.rb +28 -0
  96. data/examples/helpers/simple_captcha.rb +29 -0
  97. data/examples/{css.rb → misc/css.rb} +6 -12
  98. data/examples/misc/memleak_detector.rb +37 -0
  99. data/examples/misc/nagoro_element.rb +43 -0
  100. data/examples/{ramaise.rb → misc/ramaise.rb} +2 -2
  101. data/examples/misc/rapp.rb +56 -0
  102. data/examples/misc/sequel_scaffolding.rb +45 -0
  103. data/examples/misc/serve_directory.rb +6 -0
  104. data/examples/templates/template_erubis.rb +9 -10
  105. data/examples/templates/template_ezamar.rb +8 -7
  106. data/examples/templates/template_haml.rb +7 -8
  107. data/examples/templates/template_liquid.rb +20 -19
  108. data/examples/templates/template_markaby.rb +6 -7
  109. data/examples/templates/template_mustache.rb +70 -0
  110. data/examples/templates/template_nagoro.rb +6 -7
  111. data/examples/templates/template_redcloth.rb +8 -9
  112. data/examples/templates/template_remarkably.rb +8 -9
  113. data/examples/templates/template_tenjin.rb +10 -15
  114. data/examples/templates/{template → view}/external.haml +4 -4
  115. data/examples/templates/{template → view}/external.mab +4 -4
  116. data/examples/templates/view/external.mt +29 -0
  117. data/examples/templates/{template → view}/external.nag +4 -4
  118. data/examples/templates/{template → view}/external.redcloth +4 -4
  119. data/examples/templates/{template → view}/external.rem +4 -4
  120. data/examples/templates/{template → view}/external.rhtml +6 -6
  121. data/examples/templates/{template → view}/external.tenjin +4 -4
  122. data/examples/templates/{template → view}/external.zmr +6 -6
  123. data/guide/AUTHORS +80 -0
  124. data/guide/CHANGELOG +20210 -0
  125. data/guide/LICENSE +19 -0
  126. data/guide/_static/logo.png +0 -0
  127. data/guide/_static/logo.svg +49 -0
  128. data/guide/css/common.css +20 -0
  129. data/guide/general/cache.md +168 -0
  130. data/guide/general/configuration.md +169 -0
  131. data/guide/general/contributing.md +182 -0
  132. data/guide/general/controllers.md +210 -0
  133. data/guide/general/helpers.md +89 -0
  134. data/guide/general/installation.md +59 -0
  135. data/guide/general/logging.md +96 -0
  136. data/guide/general/middlewares.md +111 -0
  137. data/guide/general/models.md +79 -0
  138. data/{doc/readme_chunks/principles.txt → guide/general/principles.md} +15 -17
  139. data/guide/general/ramaze_command.md +110 -0
  140. data/guide/general/routes.md +82 -0
  141. data/guide/general/sessions.md +210 -0
  142. data/guide/general/special_thanks.md +69 -0
  143. data/guide/general/testing.md +228 -0
  144. data/guide/general/upgrading.md +85 -0
  145. data/guide/general/views.md +335 -0
  146. data/lib/proto/Gemfile +4 -0
  147. data/lib/proto/README.md +35 -0
  148. data/lib/proto/Rakefile +1 -0
  149. data/lib/proto/app.rb +9 -0
  150. data/lib/proto/config.ru +19 -0
  151. data/lib/proto/controller/init.rb +18 -0
  152. data/lib/proto/controller/main.rb +13 -10
  153. data/lib/proto/layout/default.xhtml +57 -0
  154. data/lib/proto/public/css/grid.css +107 -0
  155. data/lib/proto/public/css/layout.css +81 -0
  156. data/lib/proto/public/css/reset.css +123 -0
  157. data/lib/proto/public/css/text.css +109 -0
  158. data/lib/proto/public/favicon.ico +0 -0
  159. data/lib/proto/public/images/bg.png +0 -0
  160. data/lib/proto/spec/helper.rb +39 -0
  161. data/lib/proto/task/ramaze.rake +57 -0
  162. data/lib/proto/view/index.xhtml +36 -25
  163. data/lib/ramaze/app.rb +198 -0
  164. data/lib/ramaze/bin/create.rb +92 -0
  165. data/lib/ramaze/bin/runner.rb +127 -0
  166. data/lib/ramaze/cache/lru.rb +88 -0
  167. data/lib/ramaze/cache/memcache.rb +219 -0
  168. data/lib/ramaze/cache/moneta.rb +143 -0
  169. data/lib/ramaze/cache/redis.rb +163 -0
  170. data/lib/ramaze/cache/sequel.rb +373 -0
  171. data/lib/ramaze/cache.rb +42 -82
  172. data/lib/ramaze/controller/default.rb +25 -0
  173. data/lib/ramaze/controller.rb +184 -224
  174. data/lib/ramaze/current.rb +17 -68
  175. data/lib/ramaze/default_middleware.rb +24 -0
  176. data/lib/ramaze/files.rb +59 -0
  177. data/lib/ramaze/gestalt.rb +95 -63
  178. data/lib/ramaze/helper/auth.rb +107 -107
  179. data/lib/ramaze/helper/bench.rb +51 -0
  180. data/lib/ramaze/helper/blue_form.rb +683 -0
  181. data/lib/ramaze/helper/cache.rb +108 -130
  182. data/lib/ramaze/helper/csrf.rb +191 -0
  183. data/lib/ramaze/helper/email.rb +116 -0
  184. data/lib/ramaze/helper/erector.rb +113 -0
  185. data/lib/ramaze/helper/flash.rb +42 -39
  186. data/lib/ramaze/helper/formatting.rb +200 -35
  187. data/lib/ramaze/helper/gestalt.rb +49 -0
  188. data/lib/ramaze/helper/gravatar.rb +75 -0
  189. data/lib/ramaze/helper/identity.rb +93 -68
  190. data/lib/ramaze/helper/layout.rb +128 -0
  191. data/lib/ramaze/helper/link.rb +52 -119
  192. data/lib/ramaze/helper/localize.rb +143 -0
  193. data/lib/ramaze/helper/markaby.rb +26 -24
  194. data/lib/ramaze/helper/maruku.rb +15 -6
  195. data/lib/ramaze/helper/paginate.rb +315 -0
  196. data/lib/ramaze/helper/remarkably.rb +14 -0
  197. data/lib/ramaze/helper/request_accessor.rb +20 -0
  198. data/lib/ramaze/helper/send_file.rb +34 -0
  199. data/lib/ramaze/helper/simple_captcha.rb +61 -0
  200. data/lib/ramaze/helper/stack.rb +72 -62
  201. data/lib/ramaze/helper/tagz.rb +13 -12
  202. data/lib/ramaze/helper/thread.rb +25 -0
  203. data/lib/ramaze/helper/upload.rb +525 -0
  204. data/lib/ramaze/helper/user.rb +260 -39
  205. data/lib/ramaze/helper/xhtml.rb +122 -0
  206. data/lib/ramaze/helper.rb +8 -79
  207. data/lib/ramaze/log/hub.rb +41 -32
  208. data/lib/ramaze/log/informer.rb +128 -104
  209. data/lib/ramaze/log/logger.rb +25 -15
  210. data/lib/ramaze/log/logging.rb +46 -27
  211. data/lib/ramaze/log/rotatinginformer.rb +237 -0
  212. data/lib/ramaze/log/syslog.rb +57 -31
  213. data/lib/ramaze/log.rb +16 -15
  214. data/lib/ramaze/reloader/watch_inotify.rb +84 -0
  215. data/lib/ramaze/reloader/watch_stat.rb +58 -0
  216. data/lib/ramaze/reloader.rb +212 -0
  217. data/lib/ramaze/request.rb +126 -0
  218. data/lib/ramaze/response.rb +67 -0
  219. data/lib/ramaze/snippets/object/__dir__.rb +25 -0
  220. data/lib/ramaze/snippets/ramaze/deprecated.rb +23 -0
  221. data/lib/ramaze/snippets/string/camel_case.rb +17 -14
  222. data/lib/ramaze/snippets/string/color.rb +27 -24
  223. data/lib/ramaze/snippets/string/esc.rb +25 -25
  224. data/lib/ramaze/snippets/string/snake_case.rb +16 -13
  225. data/lib/ramaze/snippets/string/unindent.rb +24 -11
  226. data/lib/ramaze/snippets.rb +21 -6
  227. data/lib/ramaze/spec/bacon.rb +44 -0
  228. data/lib/ramaze/spec/helper/bacon.rb +4 -4
  229. data/lib/ramaze/spec/helper/pretty_output.rb +9 -1
  230. data/lib/ramaze/spec/helper/snippets.rb +11 -1
  231. data/lib/ramaze/spec/helper/template_examples.rb +22 -0
  232. data/lib/ramaze/version.rb +4 -13
  233. data/lib/ramaze/view/erector.rb +116 -0
  234. data/lib/ramaze/view/erubis.rb +26 -0
  235. data/lib/ramaze/view/ezamar.rb +27 -0
  236. data/lib/ramaze/view/gestalt.rb +20 -0
  237. data/lib/ramaze/view/haml.rb +27 -0
  238. data/lib/ramaze/view/liquid.rb +99 -0
  239. data/lib/ramaze/view/lokar.rb +18 -0
  240. data/lib/ramaze/view/mustache.rb +46 -0
  241. data/lib/ramaze/view/nagoro/render_partial.rb +32 -0
  242. data/lib/ramaze/view/nagoro.rb +44 -0
  243. data/lib/ramaze/view/remarkably.rb +22 -0
  244. data/lib/ramaze/view/sass.rb +22 -0
  245. data/lib/ramaze/view/slim.rb +43 -0
  246. data/lib/ramaze/view/slippers.rb +51 -0
  247. data/lib/ramaze/view/tagz.rb +67 -0
  248. data/lib/ramaze/view/tenjin.rb +32 -0
  249. data/lib/ramaze/view.rb +35 -0
  250. data/lib/ramaze.rb +60 -100
  251. data/lib/vendor/route_exceptions.rb +42 -0
  252. data/ramaze.gemspec +61 -0
  253. data/spec/examples/caching.rb +5 -8
  254. data/spec/examples/css.rb +3 -4
  255. data/spec/examples/element.rb +4 -4
  256. data/spec/examples/hello.rb +4 -5
  257. data/spec/examples/linking.rb +3 -4
  258. data/spec/examples/misc/sequel_scaffolding.rb +18 -0
  259. data/spec/examples/simple.rb +3 -8
  260. data/spec/examples/templates/template_erubis.rb +8 -18
  261. data/spec/examples/templates/template_ezamar.rb +9 -19
  262. data/spec/examples/templates/template_haml.rb +8 -20
  263. data/spec/examples/templates/template_liquid.rb +8 -24
  264. data/spec/examples/templates/template_markaby.rb +10 -19
  265. data/spec/examples/templates/template_mustache.rb +13 -0
  266. data/spec/examples/templates/template_nagoro.rb +13 -0
  267. data/spec/examples/templates/template_remarkably.rb +8 -18
  268. data/spec/examples/templates/template_tenjin.rb +8 -23
  269. data/spec/examples/todolist.rb +33 -0
  270. data/spec/helper.rb +14 -3
  271. data/spec/ramaze/action/render.rb +9 -17
  272. data/spec/ramaze/action/view/other_wrapper.erb +1 -0
  273. data/spec/ramaze/action/view/sub/sub_wrapper.xhtml +1 -0
  274. data/spec/ramaze/app/location.rb +43 -0
  275. data/spec/ramaze/app.rb +50 -0
  276. data/spec/ramaze/bin/app/config.ru +11 -0
  277. data/spec/ramaze/bin/create.rb +28 -0
  278. data/spec/ramaze/bin/runner.rb +30 -0
  279. data/spec/ramaze/cache/lru.rb +48 -0
  280. data/spec/ramaze/cache/memcache.rb +69 -0
  281. data/spec/ramaze/cache/moneta.rb +53 -0
  282. data/spec/ramaze/cache/redis.rb +58 -0
  283. data/spec/ramaze/cache/sequel.rb +60 -0
  284. data/spec/ramaze/controller/actionless_templates.rb +16 -12
  285. data/spec/ramaze/controller/lonely_mapping.rb +18 -0
  286. data/spec/ramaze/controller/mapping.rb +63 -0
  287. data/spec/ramaze/controller/provide_inheritance.rb +40 -0
  288. data/spec/ramaze/controller/resolve.rb +9 -11
  289. data/spec/ramaze/controller/subclass.rb +22 -7
  290. data/spec/ramaze/controller/template_resolving.rb +23 -61
  291. data/spec/ramaze/controller/view/bar.xhtml +1 -0
  292. data/spec/ramaze/controller/view/base/another.xhtml +1 -0
  293. data/spec/ramaze/dispatcher/directory.rb +61 -33
  294. data/spec/ramaze/dispatcher/file.rb +65 -47
  295. data/spec/ramaze/error.rb +54 -64
  296. data/spec/ramaze/files/public_1/plain.txt +1 -0
  297. data/spec/ramaze/files/public_2/rich.txt +1 -0
  298. data/spec/ramaze/files.rb +30 -0
  299. data/spec/ramaze/gestalt.rb +28 -21
  300. data/spec/ramaze/helper/auth.rb +47 -29
  301. data/spec/ramaze/helper/bench.rb +21 -0
  302. data/spec/ramaze/helper/blue_form.rb +807 -0
  303. data/spec/ramaze/helper/cache.rb +65 -84
  304. data/spec/ramaze/helper/csrf.rb +64 -0
  305. data/spec/ramaze/helper/email.rb +69 -0
  306. data/spec/ramaze/helper/flash.rb +22 -101
  307. data/spec/ramaze/helper/formatting.rb +100 -6
  308. data/spec/ramaze/helper/gestalt.rb +18 -0
  309. data/spec/ramaze/helper/gravatar.rb +43 -0
  310. data/spec/ramaze/helper/layout/alternative.xhtml +5 -0
  311. data/spec/ramaze/helper/layout/default.xhtml +5 -0
  312. data/spec/ramaze/helper/layout.rb +109 -0
  313. data/spec/ramaze/helper/link.rb +48 -102
  314. data/spec/ramaze/helper/localize.rb +65 -0
  315. data/spec/ramaze/helper/maruku.rb +22 -0
  316. data/spec/ramaze/helper/paginate.rb +304 -0
  317. data/spec/ramaze/helper/request_accessor.rb +22 -0
  318. data/spec/ramaze/helper/simple_captcha.rb +45 -0
  319. data/spec/ramaze/helper/stack.rb +54 -41
  320. data/spec/ramaze/helper/upload.rb +150 -0
  321. data/spec/ramaze/helper/uploads/text_1.txt +1 -0
  322. data/spec/ramaze/helper/uploads/text_2.txt +1 -0
  323. data/spec/ramaze/helper/user.rb +63 -20
  324. data/spec/ramaze/helper/xhtml.rb +54 -0
  325. data/spec/ramaze/log/informer.rb +30 -28
  326. data/spec/ramaze/log/logging.rb +66 -0
  327. data/spec/ramaze/log/syslog.rb +89 -4
  328. data/spec/ramaze/params.rb +12 -16
  329. data/spec/ramaze/request.rb +51 -160
  330. data/spec/ramaze/rewrite/file.css +1 -0
  331. data/spec/ramaze/session/lru.rb +58 -0
  332. data/spec/ramaze/session/memcache.rb +66 -0
  333. data/spec/ramaze/session/redis.rb +63 -0
  334. data/spec/ramaze/session/sequel.rb +62 -0
  335. data/spec/ramaze/view/erector/external_view.erector +5 -0
  336. data/spec/ramaze/view/erector/index.erector +5 -0
  337. data/spec/ramaze/view/erector/layout.erector +13 -0
  338. data/spec/ramaze/view/erector/tables.erector +23 -0
  339. data/spec/ramaze/view/erector/view.erector +6 -0
  340. data/spec/ramaze/view/erector.rb +68 -0
  341. data/spec/ramaze/view/erubis/external.rhtml +8 -0
  342. data/spec/ramaze/view/erubis/sum.rhtml +1 -0
  343. data/spec/ramaze/view/erubis.rb +73 -0
  344. data/spec/ramaze/view/ezamar/external.zmr +8 -0
  345. data/spec/ramaze/view/ezamar/sum.zmr +1 -0
  346. data/spec/ramaze/view/ezamar.rb +73 -0
  347. data/spec/ramaze/view/gestalt/external.ges +8 -0
  348. data/spec/ramaze/view/gestalt.rb +94 -0
  349. data/spec/ramaze/view/haml/external.haml +5 -0
  350. data/spec/ramaze/view/haml/sum.haml +2 -0
  351. data/spec/ramaze/view/haml.rb +114 -0
  352. data/spec/ramaze/view/liquid/external.liquid +8 -0
  353. data/spec/ramaze/view/liquid/sum.liquid +1 -0
  354. data/spec/ramaze/view/liquid.rb +73 -0
  355. data/spec/ramaze/view/lokar/external.lok +8 -0
  356. data/spec/ramaze/view/lokar/sum.lok +1 -0
  357. data/spec/ramaze/view/lokar.rb +78 -0
  358. data/spec/ramaze/view/mustache/external.mt +8 -0
  359. data/spec/ramaze/view/mustache/sum.mt +1 -0
  360. data/spec/ramaze/view/mustache.rb +77 -0
  361. data/spec/ramaze/view/nagoro/external.nag +8 -0
  362. data/spec/ramaze/view/nagoro/sum.nag +1 -0
  363. data/spec/ramaze/view/nagoro.rb +78 -0
  364. data/spec/ramaze/view/remarkably.rb +49 -0
  365. data/spec/ramaze/view/sass.rb +73 -0
  366. data/spec/ramaze/view/slim/external.slim +5 -0
  367. data/spec/ramaze/view/slim/external_vars.slim +5 -0
  368. data/spec/ramaze/view/slim.rb +49 -0
  369. data/spec/ramaze/view/slippers/external.st +8 -0
  370. data/spec/ramaze/view/slippers/sum.st +1 -0
  371. data/spec/ramaze/view/slippers.rb +49 -0
  372. data/spec/ramaze/{template → view}/tagz.rb +20 -31
  373. data/spec/ramaze/view/tenjin/external.rbhtml +8 -0
  374. data/spec/ramaze/view/tenjin/sum.rbhtml +1 -0
  375. data/spec/ramaze/view/tenjin.rb +57 -0
  376. data/spec/ramaze/view.rb +36 -0
  377. data/spec/snippets/object/__dir__.rb +17 -0
  378. data/spec/snippets/ramaze/lru_hash.rb +88 -0
  379. data/spec/snippets/string/camel_case.rb +4 -1
  380. data/spec/snippets/string/color.rb +4 -1
  381. data/spec/snippets/string/snake_case.rb +4 -1
  382. data/spec/snippets/string/unindent.rb +10 -1
  383. data/tasks/authors.rake +17 -0
  384. data/tasks/bacon.rake +81 -0
  385. data/tasks/changelog.rake +20 -0
  386. data/tasks/gems.rake +15 -0
  387. data/tasks/release.rake +38 -0
  388. data/tasks/todo.rake +31 -0
  389. data/tasks/yard.rake +13 -0
  390. metadata +813 -714
  391. data/doc/AUTHORS +0 -25
  392. data/doc/CHANGELOG +0 -5757
  393. data/doc/COPYING +0 -56
  394. data/doc/FAQ +0 -92
  395. data/doc/GPL +0 -339
  396. data/doc/INSTALL +0 -34
  397. data/doc/LEGAL +0 -26
  398. data/doc/ProjectInfo +0 -53
  399. data/doc/README +0 -435
  400. data/doc/TODO +0 -29
  401. data/doc/meta/announcement.txt +0 -126
  402. data/doc/meta/configuration.txt +0 -162
  403. data/doc/meta/internals.txt +0 -278
  404. data/doc/meta/users.kml +0 -64
  405. data/doc/migrate/1110_to_1111.txt +0 -131
  406. data/doc/readme_chunks/appendix.txt +0 -10
  407. data/doc/readme_chunks/examples.txt +0 -38
  408. data/doc/readme_chunks/features.txt +0 -148
  409. data/doc/readme_chunks/getting_help.txt +0 -5
  410. data/doc/readme_chunks/getting_started.txt +0 -18
  411. data/doc/readme_chunks/installing.txt +0 -46
  412. data/doc/readme_chunks/introduction.txt +0 -18
  413. data/doc/readme_chunks/thanks.txt +0 -59
  414. data/doc/tutorial/todolist.html +0 -816
  415. data/doc/tutorial/todolist.mkd +0 -736
  416. data/examples/auth/auth.rb +0 -54
  417. data/examples/auth/template/layout.haml +0 -20
  418. data/examples/auth/template/login.haml +0 -16
  419. data/examples/blog/README +0 -3
  420. data/examples/blog/controller/main.rb +0 -29
  421. data/examples/blog/model/entry.rb +0 -30
  422. data/examples/blog/public/styles/blog.css +0 -132
  423. data/examples/blog/spec/blog.rb +0 -87
  424. data/examples/blog/start.rb +0 -7
  425. data/examples/blog/view/edit.xhtml +0 -17
  426. data/examples/blog/view/index.xhtml +0 -17
  427. data/examples/blog/view/layout.xhtml +0 -11
  428. data/examples/blog/view/new.xhtml +0 -16
  429. data/examples/hello.rb +0 -15
  430. data/examples/linking.rb +0 -29
  431. data/examples/memleak_detector.rb +0 -32
  432. data/examples/nitro_form.rb +0 -23
  433. data/examples/rammit/spec/rammit.rb +0 -30
  434. data/examples/rammit/src/controller/main.rb +0 -3
  435. data/examples/rammit/src/controller/page.rb +0 -16
  436. data/examples/rammit/src/model.rb +0 -33
  437. data/examples/rammit/start.rb +0 -8
  438. data/examples/rammit/template/index.xhtml +0 -14
  439. data/examples/rammit/template/page/view.xhtml +0 -4
  440. data/examples/rapaste/Rakefile +0 -35
  441. data/examples/rapaste/controller/paste.rb +0 -94
  442. data/examples/rapaste/model/paste.rb +0 -55
  443. data/examples/rapaste/public/css/active4d.css +0 -114
  444. data/examples/rapaste/public/css/all_hallows_eve.css +0 -72
  445. data/examples/rapaste/public/css/amy.css +0 -147
  446. data/examples/rapaste/public/css/blackboard.css +0 -88
  447. data/examples/rapaste/public/css/brilliance_black.css +0 -605
  448. data/examples/rapaste/public/css/brilliance_dull.css +0 -599
  449. data/examples/rapaste/public/css/cobalt.css +0 -149
  450. data/examples/rapaste/public/css/dawn.css +0 -121
  451. data/examples/rapaste/public/css/display.css +0 -197
  452. data/examples/rapaste/public/css/eiffel.css +0 -121
  453. data/examples/rapaste/public/css/espresso_libre.css +0 -109
  454. data/examples/rapaste/public/css/idle.css +0 -62
  455. data/examples/rapaste/public/css/iplastic.css +0 -80
  456. data/examples/rapaste/public/css/lazy.css +0 -73
  457. data/examples/rapaste/public/css/mac_classic.css +0 -123
  458. data/examples/rapaste/public/css/magicwb_amiga.css +0 -104
  459. data/examples/rapaste/public/css/pastels_on_dark.css +0 -188
  460. data/examples/rapaste/public/css/slush_poppies.css +0 -85
  461. data/examples/rapaste/public/css/spacecadet.css +0 -51
  462. data/examples/rapaste/public/css/sunburst.css +0 -180
  463. data/examples/rapaste/public/css/twilight.css +0 -137
  464. data/examples/rapaste/public/css/zenburnesque.css +0 -91
  465. data/examples/rapaste/public/js/jquery.js +0 -11
  466. data/examples/rapaste/spec/rapaste.rb +0 -49
  467. data/examples/rapaste/start.rb +0 -24
  468. data/examples/rapaste/view/copy.xhtml +0 -10
  469. data/examples/rapaste/view/index.xhtml +0 -9
  470. data/examples/rapaste/view/layout.xhtml +0 -25
  471. data/examples/rapaste/view/list.xhtml +0 -29
  472. data/examples/rapaste/view/search.xhtml +0 -41
  473. data/examples/rapaste/view/view.xhtml +0 -37
  474. data/examples/simple_auth.rb +0 -23
  475. data/examples/sourceview/public/coderay.css +0 -104
  476. data/examples/sourceview/public/images/file.gif +0 -0
  477. data/examples/sourceview/public/images/folder.gif +0 -0
  478. data/examples/sourceview/public/images/tv-collapsable-last.gif +0 -0
  479. data/examples/sourceview/public/images/tv-collapsable.gif +0 -0
  480. data/examples/sourceview/public/images/tv-expandable-last.gif +0 -0
  481. data/examples/sourceview/public/images/tv-expandable.gif +0 -0
  482. data/examples/sourceview/public/images/tv-item-last.gif +0 -0
  483. data/examples/sourceview/public/images/tv-item.gif +0 -0
  484. data/examples/sourceview/public/jquery.js +0 -11
  485. data/examples/sourceview/public/jquery.treeview.css +0 -48
  486. data/examples/sourceview/public/jquery.treeview.js +0 -223
  487. data/examples/sourceview/public/sourceview.js +0 -52
  488. data/examples/sourceview/sourceview.rb +0 -77
  489. data/examples/sourceview/template/index.haml +0 -59
  490. data/examples/templates/template/external.amrita +0 -19
  491. data/examples/templates/template/external.xsl +0 -57
  492. data/examples/templates/template_amrita2.rb +0 -74
  493. data/examples/templates/template_xslt.rb +0 -49
  494. data/examples/todolist/README +0 -1
  495. data/examples/todolist/public/js/jquery.js +0 -1923
  496. data/examples/todolist/public/ramaze.png +0 -0
  497. data/examples/todolist/spec/todolist.rb +0 -132
  498. data/examples/todolist/src/controller/main.rb +0 -70
  499. data/examples/todolist/src/element/page.rb +0 -31
  500. data/examples/todolist/src/model.rb +0 -14
  501. data/examples/todolist/start.rb +0 -11
  502. data/examples/todolist/template/index.xhtml +0 -17
  503. data/examples/todolist/template/new.xhtml +0 -7
  504. data/examples/whywiki/spec/whywiki.rb +0 -58
  505. data/examples/whywiki/template/show.xhtml +0 -18
  506. data/examples/wikore/start.rb +0 -9
  507. data/examples/wiktacular/mkd/main/2007-07-20_19-23-10.mkd +0 -2
  508. data/examples/wiktacular/mkd/main/2007-07-20_19-45-07.mkd +0 -2
  509. data/examples/wiktacular/mkd/main/current.mkd +0 -2
  510. data/examples/wiktacular/mkd/testing/2007-07-20_16-43-46.mkd +0 -2
  511. data/lib/proto/public/css/ramaze_error.css +0 -90
  512. data/lib/proto/public/dispatch.fcgi +0 -11
  513. data/lib/proto/public/ramaze.png +0 -0
  514. data/lib/proto/spec/main.rb +0 -24
  515. data/lib/proto/start.rb +0 -8
  516. data/lib/proto/start.ru +0 -8
  517. data/lib/proto/view/error.xhtml +0 -64
  518. data/lib/proto/view/page.xhtml +0 -15
  519. data/lib/ramaze/action/render.rb +0 -163
  520. data/lib/ramaze/action.rb +0 -136
  521. data/lib/ramaze/adapter/base.rb +0 -59
  522. data/lib/ramaze/adapter/cgi.rb +0 -24
  523. data/lib/ramaze/adapter/ebb.rb +0 -32
  524. data/lib/ramaze/adapter/evented_mongrel.rb +0 -7
  525. data/lib/ramaze/adapter/fcgi.rb +0 -24
  526. data/lib/ramaze/adapter/lsws.rb +0 -23
  527. data/lib/ramaze/adapter/mongrel.rb +0 -25
  528. data/lib/ramaze/adapter/scgi.rb +0 -22
  529. data/lib/ramaze/adapter/swiftiplied_mongrel.rb +0 -7
  530. data/lib/ramaze/adapter/thin.rb +0 -22
  531. data/lib/ramaze/adapter/webrick.rb +0 -52
  532. data/lib/ramaze/adapter.rb +0 -101
  533. data/lib/ramaze/cache/memcached.rb +0 -70
  534. data/lib/ramaze/cache/memory.rb +0 -6
  535. data/lib/ramaze/cache/yaml_store.rb +0 -68
  536. data/lib/ramaze/contrib/auto_params/get_args.rb +0 -57
  537. data/lib/ramaze/contrib/auto_params.rb +0 -135
  538. data/lib/ramaze/contrib/email.rb +0 -84
  539. data/lib/ramaze/contrib/facebook/facebook.rb +0 -171
  540. data/lib/ramaze/contrib/facebook.rb +0 -23
  541. data/lib/ramaze/contrib/file_cache.rb +0 -65
  542. data/lib/ramaze/contrib/gettext/mo.rb +0 -155
  543. data/lib/ramaze/contrib/gettext/parser.rb +0 -46
  544. data/lib/ramaze/contrib/gettext/po.rb +0 -109
  545. data/lib/ramaze/contrib/gettext.rb +0 -113
  546. data/lib/ramaze/contrib/gzip_filter.rb +0 -56
  547. data/lib/ramaze/contrib/profiling.rb +0 -36
  548. data/lib/ramaze/contrib/route.rb +0 -22
  549. data/lib/ramaze/contrib/sequel/fill.rb +0 -12
  550. data/lib/ramaze/contrib/sequel_cache.rb +0 -92
  551. data/lib/ramaze/contrib.rb +0 -82
  552. data/lib/ramaze/controller/error.rb +0 -46
  553. data/lib/ramaze/controller/main.rb +0 -2
  554. data/lib/ramaze/controller/resolve.rb +0 -234
  555. data/lib/ramaze/current/request.rb +0 -181
  556. data/lib/ramaze/current/response.rb +0 -19
  557. data/lib/ramaze/current/session/flash.rb +0 -67
  558. data/lib/ramaze/current/session/hash.rb +0 -65
  559. data/lib/ramaze/current/session.rb +0 -153
  560. data/lib/ramaze/dispatcher/action.rb +0 -40
  561. data/lib/ramaze/dispatcher/directory.rb +0 -116
  562. data/lib/ramaze/dispatcher/error.rb +0 -108
  563. data/lib/ramaze/dispatcher/file.rb +0 -87
  564. data/lib/ramaze/dispatcher.rb +0 -124
  565. data/lib/ramaze/error.rb +0 -24
  566. data/lib/ramaze/global/dsl.rb +0 -39
  567. data/lib/ramaze/global/globalstruct.rb +0 -147
  568. data/lib/ramaze/global.rb +0 -116
  569. data/lib/ramaze/helper/aspect.rb +0 -100
  570. data/lib/ramaze/helper/cgi.rb +0 -43
  571. data/lib/ramaze/helper/inform.rb +0 -40
  572. data/lib/ramaze/helper/nitroform.rb +0 -14
  573. data/lib/ramaze/helper/pager.rb +0 -366
  574. data/lib/ramaze/helper/partial.rb +0 -96
  575. data/lib/ramaze/helper/redirect.rb +0 -73
  576. data/lib/ramaze/helper/sendfile.rb +0 -18
  577. data/lib/ramaze/helper/sequel.rb +0 -52
  578. data/lib/ramaze/inform.rb +0 -4
  579. data/lib/ramaze/log/analogger.rb +0 -37
  580. data/lib/ramaze/log/growl.rb +0 -35
  581. data/lib/ramaze/log/knotify.rb +0 -25
  582. data/lib/ramaze/log/xosd.rb +0 -88
  583. data/lib/ramaze/route.rb +0 -84
  584. data/lib/ramaze/snippets/array/put_within.rb +0 -37
  585. data/lib/ramaze/snippets/binding/locals.rb +0 -13
  586. data/lib/ramaze/snippets/dictionary.rb +0 -504
  587. data/lib/ramaze/snippets/divide.rb +0 -20
  588. data/lib/ramaze/snippets/kernel/__dir__.rb +0 -23
  589. data/lib/ramaze/snippets/kernel/acquire.rb +0 -39
  590. data/lib/ramaze/snippets/kernel/aquire.rb +0 -1
  591. data/lib/ramaze/snippets/kernel/constant.rb +0 -26
  592. data/lib/ramaze/snippets/kernel/pretty_inspect.rb +0 -15
  593. data/lib/ramaze/snippets/metaid.rb +0 -17
  594. data/lib/ramaze/snippets/numeric/filesize_format.rb +0 -19
  595. data/lib/ramaze/snippets/object/pretty.rb +0 -6
  596. data/lib/ramaze/snippets/object/scope.rb +0 -11
  597. data/lib/ramaze/snippets/object/thread_accessor.rb +0 -5
  598. data/lib/ramaze/snippets/object/traits.rb +0 -76
  599. data/lib/ramaze/snippets/ordered_set.rb +0 -36
  600. data/lib/ramaze/snippets/proc/locals.rb +0 -11
  601. data/lib/ramaze/snippets/ramaze/caller_info.rb +0 -30
  602. data/lib/ramaze/snippets/ramaze/caller_lines.rb +0 -51
  603. data/lib/ramaze/snippets/ramaze/thread_accessor.rb +0 -44
  604. data/lib/ramaze/snippets/string/each.rb +0 -8
  605. data/lib/ramaze/snippets/string/ord.rb +0 -15
  606. data/lib/ramaze/snippets/string/start_with.rb +0 -7
  607. data/lib/ramaze/snippets/struct/fill.rb +0 -23
  608. data/lib/ramaze/snippets/struct/values_at.rb +0 -23
  609. data/lib/ramaze/snippets/symbol/to_proc.rb +0 -24
  610. data/lib/ramaze/snippets/thread/into.rb +0 -18
  611. data/lib/ramaze/sourcereload.rb +0 -169
  612. data/lib/ramaze/spec/helper/browser.rb +0 -88
  613. data/lib/ramaze/spec/helper/mock_http.rb +0 -69
  614. data/lib/ramaze/spec/helper/requester.rb +0 -49
  615. data/lib/ramaze/spec/helper/simple_http.rb +0 -434
  616. data/lib/ramaze/spec/helper.rb +0 -122
  617. data/lib/ramaze/spec.rb +0 -1
  618. data/lib/ramaze/store/default.rb +0 -109
  619. data/lib/ramaze/template/amrita2.rb +0 -44
  620. data/lib/ramaze/template/builder.rb +0 -28
  621. data/lib/ramaze/template/erubis.rb +0 -35
  622. data/lib/ramaze/template/ezamar/element.rb +0 -169
  623. data/lib/ramaze/template/ezamar/engine.rb +0 -76
  624. data/lib/ramaze/template/ezamar/morpher.rb +0 -135
  625. data/lib/ramaze/template/ezamar/render_partial.rb +0 -31
  626. data/lib/ramaze/template/ezamar.rb +0 -42
  627. data/lib/ramaze/template/haml.rb +0 -37
  628. data/lib/ramaze/template/liquid.rb +0 -36
  629. data/lib/ramaze/template/markaby.rb +0 -52
  630. data/lib/ramaze/template/nagoro.rb +0 -51
  631. data/lib/ramaze/template/none.rb +0 -14
  632. data/lib/ramaze/template/redcloth.rb +0 -24
  633. data/lib/ramaze/template/remarkably.rb +0 -38
  634. data/lib/ramaze/template/sass.rb +0 -37
  635. data/lib/ramaze/template/tagz.rb +0 -79
  636. data/lib/ramaze/template/tenjin.rb +0 -34
  637. data/lib/ramaze/template/xslt.rb +0 -96
  638. data/lib/ramaze/template.rb +0 -81
  639. data/lib/ramaze/tool/create.rb +0 -74
  640. data/lib/ramaze/tool/localize.rb +0 -162
  641. data/lib/ramaze/tool/mime.rb +0 -25
  642. data/lib/ramaze/tool/mime_types.yaml +0 -615
  643. data/lib/ramaze/tool/record.rb +0 -6
  644. data/lib/ramaze/tool.rb +0 -9
  645. data/lib/ramaze/trinity.rb +0 -13
  646. data/lib/vendor/bacon.rb +0 -323
  647. data/rake_tasks/conf.rake +0 -73
  648. data/rake_tasks/coverage.rake +0 -46
  649. data/rake_tasks/darcs.rake +0 -5
  650. data/rake_tasks/gem.rake +0 -43
  651. data/rake_tasks/maintenance.rake +0 -384
  652. data/rake_tasks/spec.rake +0 -62
  653. data/spec/contrib/auto_params.rb +0 -121
  654. data/spec/contrib/profiling.rb +0 -26
  655. data/spec/contrib/route.rb +0 -36
  656. data/spec/contrib/sequel/fill.rb +0 -47
  657. data/spec/examples/simple_auth.rb +0 -32
  658. data/spec/examples/templates/template_amrita2.rb +0 -16
  659. data/spec/examples/templates/template_redcloth.rb +0 -28
  660. data/spec/ramaze/action/basics.rb +0 -36
  661. data/spec/ramaze/action/cache.rb +0 -43
  662. data/spec/ramaze/action/layout.rb +0 -190
  663. data/spec/ramaze/adapter/mongrel.rb +0 -12
  664. data/spec/ramaze/adapter/record.rb +0 -31
  665. data/spec/ramaze/adapter/webrick.rb +0 -12
  666. data/spec/ramaze/adapter.rb +0 -22
  667. data/spec/ramaze/cache.rb +0 -73
  668. data/spec/ramaze/controller.rb +0 -177
  669. data/spec/ramaze/current/request.rb +0 -30
  670. data/spec/ramaze/current/session.rb +0 -97
  671. data/spec/ramaze/dispatcher.rb +0 -31
  672. data/spec/ramaze/element.rb +0 -107
  673. data/spec/ramaze/helper/aspect.rb +0 -92
  674. data/spec/ramaze/helper/cgi.rb +0 -43
  675. data/spec/ramaze/helper/file.rb +0 -18
  676. data/spec/ramaze/helper/pager.rb +0 -99
  677. data/spec/ramaze/helper/partial.rb +0 -76
  678. data/spec/ramaze/helper/redirect.rb +0 -112
  679. data/spec/ramaze/localize.rb +0 -67
  680. data/spec/ramaze/morpher.rb +0 -111
  681. data/spec/ramaze/public/error404.xhtml +0 -1
  682. data/spec/ramaze/request/mongrel.rb +0 -9
  683. data/spec/ramaze/request/thin.rb +0 -9
  684. data/spec/ramaze/request/webrick.rb +0 -5
  685. data/spec/ramaze/route.rb +0 -130
  686. data/spec/ramaze/session.rb +0 -94
  687. data/spec/ramaze/store/default.rb +0 -71
  688. data/spec/ramaze/template/amrita2/external.amrita +0 -6
  689. data/spec/ramaze/template/amrita2/sum.amrita +0 -1
  690. data/spec/ramaze/template/amrita2.rb +0 -50
  691. data/spec/ramaze/template/builder/external.rxml +0 -3
  692. data/spec/ramaze/template/builder.rb +0 -55
  693. data/spec/ramaze/template/erubis/sum.rhtml +0 -1
  694. data/spec/ramaze/template/erubis.rb +0 -41
  695. data/spec/ramaze/template/ezamar/another/long/action.zmr +0 -1
  696. data/spec/ramaze/template/ezamar/combined.zmr +0 -1
  697. data/spec/ramaze/template/ezamar/file_only.zmr +0 -1
  698. data/spec/ramaze/template/ezamar/index.zmr +0 -1
  699. data/spec/ramaze/template/ezamar/nested.zmr +0 -1
  700. data/spec/ramaze/template/ezamar/other__index.xhtml +0 -1
  701. data/spec/ramaze/template/ezamar/some__long__action.zmr +0 -1
  702. data/spec/ramaze/template/ezamar/sum.zmr +0 -1
  703. data/spec/ramaze/template/ezamar.rb +0 -63
  704. data/spec/ramaze/template/haml/index.haml +0 -5
  705. data/spec/ramaze/template/haml/locals.haml +0 -2
  706. data/spec/ramaze/template/haml/with_vars.haml +0 -4
  707. data/spec/ramaze/template/haml.rb +0 -66
  708. data/spec/ramaze/template/liquid/index.liquid +0 -1
  709. data/spec/ramaze/template/liquid/products.liquid +0 -45
  710. data/spec/ramaze/template/liquid.rb +0 -99
  711. data/spec/ramaze/template/markaby/external.mab +0 -8
  712. data/spec/ramaze/template/markaby/sum.mab +0 -1
  713. data/spec/ramaze/template/markaby.rb +0 -61
  714. data/spec/ramaze/template/nagoro/another/long/action.nag +0 -1
  715. data/spec/ramaze/template/nagoro/combined.nag +0 -1
  716. data/spec/ramaze/template/nagoro/file_only.nag +0 -1
  717. data/spec/ramaze/template/nagoro/index.nag +0 -1
  718. data/spec/ramaze/template/nagoro/nested.nag +0 -1
  719. data/spec/ramaze/template/nagoro/some__long__action.nag +0 -1
  720. data/spec/ramaze/template/nagoro/sum.nag +0 -1
  721. data/spec/ramaze/template/nagoro.rb +0 -64
  722. data/spec/ramaze/template/redcloth/external.redcloth +0 -1
  723. data/spec/ramaze/template/redcloth.rb +0 -38
  724. data/spec/ramaze/template/remarkably.rb +0 -58
  725. data/spec/ramaze/template/sass.rb +0 -69
  726. data/spec/ramaze/template/tenjin/external.tenjin +0 -1
  727. data/spec/ramaze/template/tenjin.rb +0 -49
  728. data/spec/ramaze/template/xslt/concat_words.xsl +0 -16
  729. data/spec/ramaze/template/xslt/index.xsl +0 -14
  730. data/spec/ramaze/template/xslt/products.xsl +0 -32
  731. data/spec/ramaze/template/xslt/ruby_version.xsl +0 -14
  732. data/spec/ramaze/template/xslt.rb +0 -90
  733. data/spec/ramaze/template.rb +0 -128
  734. data/spec/snippets/array/put_within.rb +0 -33
  735. data/spec/snippets/divide.rb +0 -19
  736. data/spec/snippets/kernel/__dir__.rb +0 -8
  737. data/spec/snippets/kernel/acquire.rb +0 -71
  738. data/spec/snippets/kernel/constant.rb +0 -23
  739. data/spec/snippets/numeric/filesize_format.rb +0 -12
  740. data/spec/snippets/ordered_set.rb +0 -63
  741. data/spec/snippets/ramaze/caller_info.rb +0 -39
  742. data/spec/snippets/ramaze/caller_lines.rb +0 -30
  743. data/spec/snippets/struct/fill.rb +0 -26
  744. data/spec/snippets/struct/values_at.rb +0 -44
  745. data/spec/snippets/symbol/to_proc.rb +0 -13
  746. data/spec/snippets/thread/into.rb +0 -20
  747. /data/examples/{todolist → app/todolist}/public/favicon.ico +0 -0
  748. /data/examples/{upload → app/upload}/view/index.xhtml +0 -0
  749. /data/examples/{wikore/template → app/wikore/view}/index.xhtml +0 -0
  750. /data/examples/{wiktacular → app/wiktacular}/README +0 -0
  751. /data/examples/{wiktacular → app/wiktacular}/mkd/link/2007-07-20_19-45-51.mkd +0 -0
  752. /data/examples/{wiktacular → app/wiktacular}/mkd/link/current.mkd +0 -0
  753. /data/examples/{wiktacular → app/wiktacular}/mkd/main/2007-07-20_16-31-33.mkd +0 -0
  754. /data/examples/{wiktacular → app/wiktacular}/public/favicon.ico +0 -0
  755. /data/examples/{wiktacular → app/wiktacular}/public/screen.css +0 -0
  756. /data/examples/{wiktacular/template → app/wiktacular/view}/index.xhtml +0 -0
  757. /data/examples/{identity.rb → helpers/identity.rb} +0 -0
  758. /data/examples/{facebook.rb → misc/facebook.rb} +0 -0
  759. /data/examples/templates/{template → view}/external.liquid +0 -0
  760. /data/spec/ramaze/action/{template → view}/bar.xhtml +0 -0
  761. /data/spec/ramaze/action/{template → view}/instancevars/layout.xhtml +0 -0
  762. /data/spec/ramaze/action/{template → view}/other_wrapper.xhtml +0 -0
  763. /data/spec/ramaze/action/{template → view}/single_wrapper.xhtml +0 -0
  764. /data/spec/ramaze/action/{template/sub/sub_wrapper.xhtml → view/sub/sub_wrapper.erb} +0 -0
  765. /data/spec/ramaze/controller/{template → view}/greet.xhtml +0 -0
  766. /data/spec/ramaze/controller/{template → view}/list.xhtml +0 -0
  767. /data/spec/ramaze/controller/{template → view}/other/greet/other.xhtml +0 -0
  768. /data/spec/ramaze/controller/{template → view}/other_wrapper.xhtml +0 -0
  769. /data/spec/ramaze/helper/{template → view}/locals.xhtml +0 -0
  770. /data/spec/ramaze/helper/{template → view}/loop.xhtml +0 -0
  771. /data/spec/ramaze/helper/{template → view}/num.xhtml +0 -0
  772. /data/spec/ramaze/helper/{template → view}/partial.xhtml +0 -0
  773. /data/spec/ramaze/helper/{template → view}/recursive.xhtml +0 -0
  774. /data/spec/ramaze/helper/{template → view}/recursive_local_ivars.xhtml +0 -0
  775. /data/spec/ramaze/helper/{template → view}/recursive_locals.xhtml +0 -0
  776. /data/spec/ramaze/helper/{template → view}/test_template.xhtml +0 -0
  777. /data/spec/ramaze/{template → view}/remarkably/external.rem +0 -0
  778. /data/spec/ramaze/{template → view}/remarkably/sum.rem +0 -0
  779. /data/spec/ramaze/{template → view}/sass/file.css.sass +0 -0
  780. /data/spec/ramaze/{template → view}/tagz/external.tagz +0 -0
  781. /data/spec/ramaze/{template → view}/tagz/sum.tagz +0 -0
@@ -0,0 +1,683 @@
1
+ require 'ramaze'
2
+ require 'ramaze/gestalt'
3
+
4
+ module Ramaze
5
+ module Helper
6
+ ##
7
+ # The BlueForm helper tries to be an even better way to build forms
8
+ # programmatically. By using a simple block you can quickly create all the
9
+ # required elements for your form.
10
+ #
11
+ # See {Ramaze::Helper::BlueForm::Form} for all the available methods.
12
+ #
13
+ # ## Form Data
14
+ #
15
+ # As stated earlier it's possible to pass an object to the form_for()
16
+ # method. What kind of object this is, a database result object or an
17
+ # OpenStruct object doesn't matter as long as the attributes can be accessed
18
+ # outside of the object (this can be done using attr_readers). This makes it
19
+ # extremely easy to directly pass a result object from your favourite ORM.
20
+ # Example:
21
+ #
22
+ # @data = User[1]
23
+ #
24
+ # form_for(@data, :method => :post) do |f|
25
+ # f.input_text 'Username', :username
26
+ # end
27
+ #
28
+ # The object comes handy when you want to do server-side form validation:
29
+ # if the form can not be validated, just send back the object with keys
30
+ # containing what the user has filled. The fields will be populated with
31
+ # these values, so the user doesn't have to retype everything.
32
+ #
33
+ # If you don't want to use an object you can simply set the first parameter
34
+ # to nil.
35
+ #
36
+ # ## HTML Output
37
+ #
38
+ # The form helper uses Gestalt, Ramaze's custom HTML builder that works
39
+ # somewhat like Erector. The output is very minimalistic, elements such as
40
+ # legends and fieldsets have to be added manually.
41
+ #
42
+ # If you need to add elements not covered by Form methods (e.g. `<div>`
43
+ # tags), you can access the form Gestalt instance with the g() method and
44
+ # generate your tags like this :
45
+ #
46
+ # form_for(@result, :method => :post) do |f|
47
+ # f.g.div(:class => "awesome") do
48
+ # ...
49
+ # end
50
+ # end
51
+ #
52
+ # Each combination of a label and input element will be wrapped in
53
+ # `<p>` tags.
54
+ #
55
+ # When using the form helper as a block in your templates it's important to
56
+ # remember that the result is returned and not displayed in the browser
57
+ # directly. When using Etanni this would result in something like the
58
+ # following:
59
+ #
60
+ # #{form_for(@result, :method => :post) do |f|
61
+ # f.input_text 'Text label', :textname, 'Chunky bacon!'
62
+ # end}
63
+ #
64
+ # @example Creating a basic form
65
+ # form_for(@data, :method => :post) do |f|
66
+ # f.input_text 'Username', :username
67
+ # end
68
+ #
69
+ # @example Adding custom elements inside a form
70
+ # form_for(@result, :method => :post) do |f|
71
+ # f.fieldset do
72
+ # f.g.div(:class => "control-group") do
73
+ # f.input_text 'Text label', :textname, { :placeholder => 'Chunky bacon!',
74
+ # :class => :bigsize }
75
+ # end
76
+ # end
77
+ # end
78
+ #
79
+ module BlueForm
80
+ ##
81
+ # The form method generates the basic structure of the form. It should be
82
+ # called using a block and it's return value should be manually sent to
83
+ # the browser (since it does not echo the value).
84
+ #
85
+ # @param [Object] form_values Object containing the values for each form
86
+ # field.
87
+ # @param [Hash] options Hash containing any additional form attributes
88
+ # such as the method, action, enctype and so on.
89
+ # @param [Block] block Block containing the elements of the form such as
90
+ # password fields, textareas and so on.
91
+ #
92
+ def form_for(form_values, options = {}, &block)
93
+ form = Form.new(form_values, options)
94
+ form.build(form_errors, &block)
95
+ form
96
+ end
97
+
98
+ ##
99
+ # Manually add a new error to the form_errors key in the flash hash. The
100
+ # first parameter is the name of the form field and the second parameter
101
+ # is the custom message.
102
+ #
103
+ # @param [String] name The name of the form field to which the error
104
+ # belongs.
105
+ # @param [String] message The custom error message to show.
106
+ #
107
+ def form_error(name, message)
108
+ if respond_to?(:flash)
109
+ old = flash[:form_errors] || {}
110
+ flash[:form_errors] = old.merge(name.to_s => message.to_s)
111
+ else
112
+ form_errors[name.to_s] = message.to_s
113
+ end
114
+ end
115
+
116
+ ##
117
+ # Returns the hash containing all existing errors and allows other methods
118
+ # to set new errors by using this method as if it were a hash.
119
+ #
120
+ # @return [Array] All form errors.
121
+ #
122
+ def form_errors
123
+ if respond_to?(:flash)
124
+ flash[:form_errors] ||= {}
125
+ else
126
+ @form_errors ||= {}
127
+ end
128
+ end
129
+
130
+ ##
131
+ # Retrieve all the form errors for the specified model and add them to the
132
+ # flash hash.
133
+ #
134
+ # @param [Object] obj An object of a model that contains form errors.
135
+ #
136
+ def form_errors_from_model(obj)
137
+ if obj.respond_to?(:errors)
138
+ obj.errors.each do |key, value|
139
+ if value.respond_to?(:first)
140
+ value = value.first
141
+ end
142
+
143
+ form_error(key.to_s, value % key)
144
+ end
145
+ end
146
+ end
147
+
148
+ ##
149
+ # Main form class that contains all the required methods to generate form
150
+ # specific tags, such as textareas and select boxes. Do note that this
151
+ # class is not thread-safe so you should modify it only within one thread
152
+ # of execution.
153
+ #
154
+ class Form
155
+ attr_reader :g
156
+ attr_reader :form_values
157
+
158
+ ##
159
+ # Constructor method that generates an instance of the Form class.
160
+ #
161
+ # @param [Object] form_values Object containing the values for each form
162
+ # field.
163
+ # @param [Hash] options A hash containing any additional form attributes.
164
+ # @return [Object] An instance of the Form class.
165
+ #
166
+ def initialize(form_values, options)
167
+ @form_values = form_values
168
+ @form_args = options.dup
169
+ @g = Gestalt.new
170
+ end
171
+
172
+ ##
173
+ # Builds the form by generating the opening/closing tags and executing
174
+ # the methods in the block.
175
+ #
176
+ # @param [Hash] form_errors Hash containing all form errors (if any).
177
+ #
178
+ def build(form_errors = {})
179
+ # Convert all the keys in form_errors to strings and
180
+ # retrieve the correct values in case
181
+ @form_errors = {}
182
+
183
+ form_errors.each do |key, value|
184
+ if value.respond_to?(:first)
185
+ value = value.first
186
+ end
187
+
188
+ @form_errors[key.to_s] = value
189
+ end
190
+
191
+ @g.form(@form_args) do
192
+ if block_given?
193
+ yield self
194
+ end
195
+ end
196
+ end
197
+
198
+ ##
199
+ # Generate a `<legend>` tag.
200
+ #
201
+ # @param [String] text The text to display inside the legend tag.
202
+ # @example
203
+ # form_for(@data, :method => :post) do |f|
204
+ # f.legend 'Ramaze rocks!'
205
+ # end
206
+ #
207
+ def legend(text)
208
+ @g.legend(text)
209
+ end
210
+
211
+ ##
212
+ # Generate a fieldset tag.
213
+ #
214
+ # @param [Proc] block The form elements to display inside the fieldset.
215
+ # @example
216
+ # form_for(@data, :method => :post) do |f|
217
+ # f.fieldset do
218
+ # f.legend 'Hello, world!'
219
+ # end
220
+ # end
221
+ #
222
+ def fieldset(&block)
223
+ @g.fieldset(&block)
224
+ end
225
+
226
+ ##
227
+ # Generate an input tag with a type of "text" along with a label tag.
228
+ # This method also has the alias "text" so feel free to use that one
229
+ # instead of input_text.
230
+ #
231
+ # @param [String] label The text to display inside the label tag.
232
+ # @param [String Symbol] name The name of the text field.
233
+ # @param [Hash] args Any additional HTML attributes along with their
234
+ # values.
235
+ # @example
236
+ # form_for(@data, :method => :post) do |f|
237
+ # f.input_text 'Username', :username
238
+ # end
239
+ #
240
+ def input_text(label, name, args = {})
241
+ # The ID can come from 2 places, id_for and the args hash
242
+ id = args[:id] ? args[:id] : id_for(name)
243
+ args = args.merge(:type => :text, :name => name, :id => id)
244
+
245
+ if !args[:value] and @form_values.respond_to?(name)
246
+ args[:value] = @form_values.send(name)
247
+ end
248
+
249
+ @g.p do
250
+ label_for(id, label, name)
251
+ @g.input(args)
252
+ end
253
+ end
254
+ alias text input_text
255
+
256
+ ##
257
+ # Generate an input tag with a type of "password" along with a label.
258
+ # Password fields are pretty much the same as text fields except that
259
+ # the content of these fields is replaced with dots. This method has the
260
+ # following alias: "password".
261
+ #
262
+ # @param [String] label The text to display inside the label tag.
263
+ # @param [String Symbol] name The name of the password field.
264
+ # @param [Hash] args Any additional HTML attributes along with their
265
+ # values.
266
+ # @example
267
+ # form_for(@data, :method => :post) do |f|
268
+ # f.input_password 'My password', :password
269
+ # end
270
+ #
271
+ def input_password(label, name, args = {})
272
+ # The ID can come from 2 places, id_for and the args hash
273
+ id = args[:id] ? args[:id] : id_for(name)
274
+ args = args.merge(:type => :password, :name => name, :id => id)
275
+
276
+ if !args[:value] and @form_values.respond_to?(name)
277
+ args[:value] = @form_values.send(name)
278
+ end
279
+
280
+ @g.p do
281
+ label_for(id, label, name)
282
+ @g.input(args)
283
+ end
284
+ end
285
+ alias password input_password
286
+
287
+ ##
288
+ # Generate a submit tag (without a label). A submit tag is a button that
289
+ # once it's clicked will send the form data to the server.
290
+ #
291
+ # @param [String] value The text to display in the button.
292
+ # @param [Hash] args Any additional HTML attributes along with their
293
+ # values.
294
+ # @example
295
+ # form_for(@data, :method => :post) do |f|
296
+ # f.input_submit 'Save'
297
+ # end
298
+ #
299
+ def input_submit(value = nil, args = {})
300
+ args = args.merge(:type => :submit)
301
+ args[:value] = value unless value.nil?
302
+
303
+ @g.p do
304
+ @g.input(args)
305
+ end
306
+ end
307
+ alias submit input_submit
308
+
309
+ ##
310
+ # Generate an input tag with a type of "checkbox".
311
+ #
312
+ # If you want to have multiple checkboxes you can either use an array or
313
+ # a hash. In the case of an array the values will also be used as text
314
+ # for each checkbox. When using a hash the key will be displayed and
315
+ # the value will be the value of the checkbox. Example:
316
+ #
317
+ # @data = Class.new
318
+ # attr_reader :gender_arr
319
+ # attr_reader :gender_hash
320
+ #
321
+ # def initialize
322
+ # @gender_arr = ['male', 'female']
323
+ # @gender_hash = {"Male" => "male", "Female" => "female"}
324
+ # end
325
+ # end.new
326
+ #
327
+ # form_for(@data, :method => :post) do |f|
328
+ # f.input_checkbox "Gender", :gender_arr
329
+ # f.input_checkbox "Gender", :gender_hash
330
+ # end
331
+ #
332
+ # @example
333
+ # form_for(@data, :method => :post) do |f|
334
+ # f.input_checkbox 'Remember me', :remember_user
335
+ # end
336
+ #
337
+ # @param [String] label The text to display inside the label tag.
338
+ # @param [String Symbol] name The name of the checkbox.
339
+ # @param [String/Array] checked String or array that indicates which
340
+ # value(s) should be checked.
341
+ # @param [Hash] args Any additional HTML attributes along with their
342
+ # values.
343
+ # @option args [String/Symbol] :id The value to use for the ID attribute.
344
+ # @option args [Array] :values An array containing the possible values
345
+ # for the checkboxes.
346
+ # @option args [String/Symbol] :span_class The class to use for the
347
+ # `<span>` element that's wrapped around the checkbox.
348
+ # @option args [TrueClass/FalseClass] :show_value When set to false the
349
+ # value of each checkbox won't be displayed to the right of the
350
+ # checkbox. This option is set to true by default.
351
+ # @option args [TrueClass/FalseClass] :show_label When set to true
352
+ # (default) the label for the checkbox will be displayed. Setting this
353
+ # to false will hide it.
354
+ #
355
+ def input_checkbox(label, name, checked = nil, args = {})
356
+ id = args[:id] ? args[:id] : "#{id_for(name)}_0"
357
+
358
+ # Determine whether or not to show the value of the checkbox
359
+ if args.key?(:show_value)
360
+ show_value = args.delete(:show_value)
361
+ else
362
+ show_value = true
363
+ end
364
+
365
+ # Determine whether or not to show the label
366
+ if args.key?(:show_label)
367
+ show_label = args.delete(:show_label)
368
+ else
369
+ show_label = true
370
+ end
371
+
372
+ # Get the checkbox value from either the args hash or from
373
+ # the form object (as specified in the form_for() method).
374
+ if !args[:values] and @form_values.respond_to?(name)
375
+ args[:values] = @form_values.send(name)
376
+ end
377
+
378
+ # That class for each element wrapper (a span tag) can be customized
379
+ # using :span_class => "a_class".
380
+ if args[:span_class]
381
+ span_class = args[:span_class]
382
+ args.delete(:span_class)
383
+ else
384
+ span_class = "checkbox_wrap"
385
+ end
386
+
387
+ # Get the type from the args hash instead of pre-defining it. Doing so
388
+ # means we can use this method for the input_radio method.
389
+ args[:type] = :checkbox if !args[:type]
390
+
391
+ # Convert the values to an array if it's something we can't use in a loop
392
+ # (e.g. a string).
393
+ if args[:values].class != Hash and args[:values].class != Array
394
+ args[:values] = [args[:values]]
395
+ end
396
+
397
+ # Create a checkbox for each value
398
+ if !args[:values].empty?
399
+ @g.p do
400
+ # Let's create the label and the hidden field
401
+ if show_label === true
402
+ label_for(id, label, name)
403
+ end
404
+
405
+ # Loop through all the values. Each checkbox will have an ID of
406
+ # "form-NAME-INDEX". Each name will be NAME followed by [] to
407
+ # indicate it's an array (since multiple values are possible).
408
+ args[:values].each_with_index do |value, index|
409
+ id = args[:id] ? args[:id] : "#{id_for(name)}_#{index}"
410
+
411
+ if args[:type] == :checkbox
412
+ checkbox_name = "#{name}[]"
413
+ else
414
+ checkbox_name = name
415
+ end
416
+
417
+ # Copy all additional attributes and their values except the
418
+ # values array.
419
+ opts = args.clone
420
+ opts.delete(:values)
421
+
422
+ # Get the value and text to display for each checkbox
423
+ if value.class == Array
424
+ checkbox_text = value[0]
425
+ checkbox_value = value[1]
426
+ else
427
+ checkbox_text = checkbox_value = value
428
+ end
429
+
430
+ # Let's see if the current item is checked
431
+ if checked.class == Array
432
+ if checked.include?(checkbox_value)
433
+ opts[:checked] = 'checked'
434
+ end
435
+ else
436
+ if checkbox_value == checked
437
+ opts[:checked] = 'checked'
438
+ end
439
+ end
440
+
441
+ # And we're done, easy wasn't it?
442
+ opts = opts.merge(
443
+ :name => checkbox_name, :id => id, :value => checkbox_value
444
+ )
445
+
446
+ # Generate the following HTML:
447
+ #
448
+ # <span class="#{span_class}">
449
+ # <input type="checkbox" name="#{checkbox_name}" id="#{id}"
450
+ # value="#{value}" /> #{value}
451
+ # </span>
452
+ #
453
+ @g.span(:class => span_class) do
454
+ @g.input(opts)
455
+ " #{checkbox_text}" if show_value === true
456
+ end
457
+ end
458
+ end
459
+ end
460
+ end
461
+ alias checkbox input_checkbox
462
+
463
+ ##
464
+ # Generate an input tag with a type of "radio".
465
+ #
466
+ # If you want to generate multiple radio buttons you can use an array
467
+ # just like you can with checkboxes. Example:
468
+ #
469
+ # @data = Class.new
470
+ # attr_reader :gender_arr
471
+ # attr_reader :gender_hash
472
+ #
473
+ # def initialize
474
+ # @gender_arr = ['male', 'female']
475
+ # @gender_hash = {"Male" => "male", "Female" => "female"}
476
+ # end
477
+ # end.new
478
+ #
479
+ # form_for(@data, :method => :post) do |f|
480
+ # f.input_radio "Gender", :gender_arr
481
+ # f.input_radio "Gender", :gender_hash
482
+ # end
483
+ #
484
+ # For more information see the input_checkbox() method.
485
+ #
486
+ # @param [String] label The text to display inside the label tag.
487
+ # @param [String Symbol] name The name of the radio button.
488
+ # @param [String] checked String that indicates if (and which) radio
489
+ # button should be checked.
490
+ # @param [Hash] args Any additional HTML attributes along with their
491
+ # values.
492
+ # @see input_checkbox()
493
+ # @example
494
+ # form_for(@data, :method => :post) do |f|
495
+ # f.input_radio 'Gender', :gender
496
+ # end
497
+ #
498
+ def input_radio(label, name, checked = nil, args = {})
499
+ # Force a type of "radio"
500
+ args[:type] = :radio
501
+
502
+ if !args[:span_class]
503
+ args[:span_class] = "radio_wrap"
504
+ end
505
+
506
+ self.input_checkbox(label, name, checked, args)
507
+ end
508
+ alias radio input_radio
509
+
510
+ ##
511
+ # Generate a field for uploading files.
512
+ #
513
+ # @param [String] label The text to display inside the label tag.
514
+ # @param [String Symbol] name The name of the radio tag.
515
+ # @param [Hash] args Any additional HTML attributes along with their
516
+ # values.
517
+ # @example
518
+ # form_for(@data, :method => :post) do |f|
519
+ # f.input_file 'Image', :image
520
+ # end
521
+ #
522
+ def input_file(label, name, args = {})
523
+ id = args[:id] ? args[:id] : id_for(name)
524
+ args = args.merge(:type => :file, :name => name, :id => id)
525
+
526
+ @g.p do
527
+ label_for(id, label, name)
528
+ @g.input(args)
529
+ end
530
+ end
531
+ alias file input_file
532
+
533
+ ##
534
+ # Generate a hidden field. Hidden fields are essentially the same as
535
+ # text fields except that they aren't displayed in the browser.
536
+ #
537
+ # @param [String Symbol] name The name of the hidden field tag.
538
+ # @param [String] value The value of the hidden field
539
+ # @param [Hash] args Any additional HTML attributes along with their
540
+ # values.
541
+ # @example
542
+ # form_for(@data, :method => :post) do |f|
543
+ # f.input_hidden :user_id
544
+ # end
545
+ #
546
+ def input_hidden(name, value = nil, args = {})
547
+ args = args.merge(:type => :hidden, :name => name)
548
+
549
+ if !value and @form_values.respond_to?(name)
550
+ args[:value] = @form_values.send(name)
551
+ else
552
+ args[:value] = value
553
+ end
554
+
555
+ @g.input(args)
556
+ end
557
+ alias hidden input_hidden
558
+
559
+ ##
560
+ # Generate a text area.
561
+ #
562
+ # @param [String] label The text to display inside the label tag.
563
+ # @param [String Symbol] name The name of the textarea.
564
+ # @param [Hash] args Any additional HTML attributes along with their
565
+ # values.
566
+ # @example
567
+ # form_for(@data, :method => :post) do |f|
568
+ # f.textarea 'Description', :description
569
+ # end
570
+ #
571
+ def textarea(label, name, args = {})
572
+ id = args[:id] ? args[:id] : id_for(name)
573
+
574
+ # Get the value of the textarea
575
+ if !args[:value] and @form_values.respond_to?(name)
576
+ value = @form_values.send(name)
577
+ else
578
+ value = args[:value]
579
+ args.delete(:value)
580
+ end
581
+
582
+ args = args.merge(:name => name, :id => id)
583
+
584
+ @g.p do
585
+ label_for(id, label, name)
586
+ @g.textarea(args){ value }
587
+ end
588
+ end
589
+
590
+ ##
591
+ # Generate a select tag along with the option tags and a label.
592
+ #
593
+ # @param [String] label The text to display inside the label tag.
594
+ # @param [String Symbol] name The name of the select tag.
595
+ # @param [Hash] args Hash containing additional HTML attributes.
596
+ # @example
597
+ # form_for(@data, :method => :post) do |f|
598
+ # f.select 'Country', :country_list
599
+ # end
600
+ #
601
+ def select(label, name, args = {})
602
+ id = args[:id] ? args[:id] : id_for(name)
603
+ multiple, size = args.values_at(:multiple, :size)
604
+
605
+ # Get all the values
606
+ if !args[:values] and @form_values.respond_to?(name)
607
+ values = @form_values.send(name)
608
+ else
609
+ values = args[:values]
610
+ args.delete(:values)
611
+ end
612
+
613
+ args[:multiple] = 'multiple' if multiple
614
+ args[:size] = (size || values.count || 1).to_i
615
+ args[:name] = multiple ? "#{name}[]" : name
616
+ args = args.merge(:id => id)
617
+
618
+ # Retrieve the selected value
619
+ has_selected, selected = args.key?(:selected), args[:selected]
620
+ selected = [selected] if !selected.is_a?(Array)
621
+ args.delete(:selected)
622
+
623
+ @g.p do
624
+ label_for(id, label, name)
625
+ @g.select args do
626
+ values.each do |value, o_name|
627
+ o_name ||= value
628
+ o_args = {:value => value}
629
+
630
+ if has_selected and selected.include?(value)
631
+ o_args[:selected] = 'selected'
632
+ end
633
+
634
+ @g.option(o_args){ o_name }
635
+ end
636
+ end
637
+ end
638
+ end
639
+
640
+ ##
641
+ # Method used for converting the results of the BlueForm helper to a
642
+ # string
643
+ #
644
+ # @return [String] The form output
645
+ #
646
+ def to_s
647
+ @g.to_s
648
+ end
649
+
650
+ private
651
+
652
+ ##
653
+ # Generate a label based on the id and value.
654
+ #
655
+ # @param [String] id The ID to which the label belongs.
656
+ # @param [String] value The text to display inside the label tag.
657
+ # @param [String] name The name of the field to which the label belongs.
658
+ #
659
+ def label_for(id, value, name)
660
+ if error = @form_errors.delete(name.to_s)
661
+ @g.label("#{value} ", :for => id){ @g.span(:class => :error){ error } }
662
+ else
663
+ @g.label(value, :for => id)
664
+ end
665
+ end
666
+
667
+ ##
668
+ # Generate a value for an ID tag based on the field's name.
669
+ #
670
+ # @param [String] field_name The name of the field.
671
+ # @return [String] The ID for the specified field name.
672
+ #
673
+ def id_for(field_name)
674
+ if name = @form_args[:name]
675
+ "#{name}_#{field_name}".downcase.gsub(/-/, '_')
676
+ else
677
+ "form_#{field_name}".downcase.gsub(/-/, '_')
678
+ end
679
+ end
680
+ end # Form
681
+ end # BlueForm
682
+ end # Helper
683
+ end # Ramaze