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,62 @@
1
+ # * Encoding: UTF-8
2
+ $KCODE = 'u' if /regexp/.respond_to?(:kcode)
3
+ require 'spec/helper'
4
+ spec_requires 'locale/tag', 'locale'
5
+
6
+ class SpecHelperLocalize < Ramaze::Controller
7
+ map '/'
8
+ helper :localize
9
+
10
+ def index
11
+ locale.language
12
+ end
13
+
14
+ def translate(string)
15
+ l(string)
16
+ end
17
+
18
+ private
19
+
20
+ def localize_dictionary
21
+ DICTIONARY
22
+ end
23
+ end
24
+
25
+ DICTIONARY = Ramaze::Helper::Localize::Dictionary.new
26
+ DICTIONARY.load(:en, :hash => {'one' => 'one', 'two' => 'two'})
27
+ DICTIONARY.load(:de, :hash => {'one' => 'eins', 'two' => 'zwei'})
28
+ DICTIONARY.load(:ja, :hash => {'one' => '一', 'three' => '三'})
29
+
30
+ describe Ramaze::Helper::Localize do
31
+ behaves_like :rack_test
32
+
33
+ should 'default to a language' do
34
+ get('/').body.should == 'en'
35
+ end
36
+
37
+ should 'override language by ?lang' do
38
+ get('/?lang=de').body.should == 'de'
39
+ end
40
+
41
+ should 'override language by cookie' do
42
+ set_cookie('lang=ja')
43
+ get('/').body.should == 'ja'
44
+ clear_cookies
45
+ end
46
+
47
+ should 'not fail if language is invalid' do
48
+ get('/?lang=foobar').body.should == 'foobar'
49
+ end
50
+
51
+ should 'use dictionary to translate' do
52
+ get('/translate/one').body.should == 'one'
53
+ get('/translate/one?lang=en').body.should == 'one'
54
+ get('/translate/one?lang=ja').body.should == '一'
55
+ get('/translate/one?lang=de').body.should == 'eins'
56
+ end
57
+
58
+ it "falls back to default language if string wasn't found in dictionary" do
59
+ get('/translate/two?lang=ja').body.should == 'two'
60
+ get('/translate/three?lang=ja').body.should == '三'
61
+ end
62
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec/helper'
2
+ spec_require 'maruku'
3
+
4
+ class SpecHelperMaruku < Ramaze::Controller
5
+ map '/'
6
+ helper :maruku
7
+
8
+ def index
9
+ maruku('# Hello')
10
+ end
11
+ end
12
+
13
+ describe Ramaze::Helper::Maruku do
14
+ behaves_like :rack_test
15
+
16
+ it 'converts a markdown string to html' do
17
+ get('/').body.should =~ /<h1 id=["']hello["']>Hello<\/h1>/
18
+ end
19
+ end
@@ -0,0 +1,96 @@
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
+ require 'spec/helper'
5
+ spec_require 'hpricot'
6
+
7
+ module Og
8
+ class Mock
9
+ def initialize(*a); @a = a; end
10
+ def all(o) @a[(o[:offset]||0),o[:limit]] end
11
+ def count(*a) @a.size end
12
+ alias reload all
13
+ end
14
+ module Mixin; end
15
+ module Collection; end
16
+ end
17
+
18
+ class TCPagerController < Ramaze::Controller
19
+ map '/'
20
+ helper :pager
21
+
22
+ def page
23
+ stuff = [1, 2, 3, 4, 5, 6, 7, 8, 9]
24
+
25
+ items, pager = paginate(stuff, :limit => 2)
26
+
27
+ items.inspect
28
+ end
29
+ end
30
+
31
+ shared 'pager' do
32
+ behaves_like :rack_test
33
+ extend Ramaze::Helper::Pager
34
+
35
+ def pager_key
36
+ Ramaze::Pager.trait[:key]
37
+ end
38
+
39
+ # Used internally in Pager to get parameters like: ?_page=1
40
+ def request
41
+ req = Object.new
42
+ def req.params
43
+ {Ramaze::Pager.trait[:key] => 1}
44
+ end
45
+ req
46
+ end
47
+
48
+ before do
49
+ @items, @pager = paginate(@stuff, :limit => 2)
50
+ end
51
+
52
+ it 'should be paginated' do
53
+ get('/page').body.should == [1, 2].inspect
54
+ get('/page?_page=2').body.should == [3, 4].inspect
55
+ end
56
+
57
+ it "should report the number of articles as Pager#total_count" do
58
+ @pager.total_count.should.equal 5
59
+ end
60
+
61
+ it "should return the same number of items as passed to :per_page" do
62
+ @items.size.should.equal 2
63
+ end
64
+
65
+ it "should link to other pages" do
66
+ # mock the action
67
+ action = '/page'
68
+ def action.node; TCPagerController; end
69
+ def action.name; self; end
70
+ Ramaze::Current.actions = [action]
71
+
72
+ @pager.should.not.be.nil
73
+ @pager.navigation.should.not.be.nil
74
+
75
+ page = Hpricot(@pager.navigation)
76
+ (page / 'a').size.should == 4
77
+ end
78
+ end
79
+
80
+ describe "Array Pager" do
81
+ @stuff = (1..5).to_a
82
+
83
+ behaves_like "pager"
84
+ end
85
+
86
+ describe "OgPager" do
87
+ @stuff = Og::Mock.new(1,2,3,4,5).extend(Og::Mixin)
88
+
89
+ behaves_like "pager"
90
+ end
91
+
92
+ describe "OgCollectionPager" do
93
+ @stuff = Og::Mock.new(1,2,3,4,5).extend(Og::Collection)
94
+
95
+ behaves_like "pager"
96
+ end
@@ -0,0 +1,68 @@
1
+ require 'spec/helper'
2
+ spec_require 'hpricot'
3
+
4
+ class SpecHelperPaginateArray < Ramaze::Controller
5
+ map '/array'
6
+ helper :paginate
7
+
8
+ ALPHA = %w[ alpha beta gamma delta epsilon zeta eta theta iota kappa lambda
9
+ mu nu xi omicron pi rho sigma tau ypsilon phi chi psi omega ]
10
+
11
+ def navigation
12
+ pager = paginate(ALPHA)
13
+ pager.navigation
14
+ end
15
+
16
+ def iteration
17
+ pager = paginate(ALPHA)
18
+ out = []
19
+ pager.each{|item| out << item }
20
+ out.inspect
21
+ end
22
+ end
23
+
24
+ describe Ramaze::Helper::Paginate do
25
+ describe 'Array' do
26
+ behaves_like :rack_test
27
+
28
+ it 'shows navigation for page 1' do
29
+ doc = Hpricot(get("/array/navigation").body)
30
+ (doc/:a).map{|a| [a.inner_text, a[:href]] }.
31
+ should == [
32
+ ['1', '/array/navigation?pager=1'],
33
+ ['2', '/array/navigation?pager=2'],
34
+ ['3', '/array/navigation?pager=3'],
35
+ ['>', '/array/navigation?pager=2'],
36
+ ['>>', '/array/navigation?pager=3']]
37
+ end
38
+
39
+ it 'shows navigation for page 2' do
40
+ doc = Hpricot(get("/array/navigation?pager=2").body)
41
+ (doc/:a).map{|a| [a.inner_text, a[:href]] }.
42
+ should == [
43
+ ['<<', '/array/navigation?pager=1'],
44
+ ['<', '/array/navigation?pager=1'],
45
+ ['1', '/array/navigation?pager=1'],
46
+ ['2', '/array/navigation?pager=2'],
47
+ ['3', '/array/navigation?pager=3'],
48
+ ['>', '/array/navigation?pager=3'],
49
+ ['>>', '/array/navigation?pager=3']]
50
+ end
51
+
52
+ it 'shows navigation for page 3' do
53
+ doc = Hpricot(get("/array/navigation?pager=3").body)
54
+ (doc/:a).map{|a| [a.inner_text, a[:href]] }.
55
+ should == [
56
+ ['<<', '/array/navigation?pager=1'],
57
+ ['<', '/array/navigation?pager=2'],
58
+ ['1', '/array/navigation?pager=1'],
59
+ ['2', '/array/navigation?pager=2'],
60
+ ['3', '/array/navigation?pager=3']]
61
+ end
62
+
63
+ it 'iterates over the items in the pager' do
64
+ got = get('/array/iteration')
65
+ got.body.scan(/\w+/).should == SpecHelperPaginateArray::ALPHA.first(10)
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec/helper'
2
+
3
+ class SpecHelperRequestAccessor < Ramaze::Controller
4
+ map '/'
5
+ helper :request_accessor
6
+
7
+ def index
8
+ get? ? 'GET' : request_method
9
+ end
10
+ end
11
+
12
+ describe 'Ramaze::Helper::RequestAccessor' do
13
+ behaves_like :rack_test
14
+
15
+ it 'gives direct access to methods in Request' do
16
+ get('/').body.should == 'GET'
17
+ put('/').body.should == 'PUT'
18
+ end
19
+ end
@@ -0,0 +1,91 @@
1
+ require 'spec/helper'
2
+
3
+ spec_requires 'hpricot', 'sequel'
4
+
5
+ DB = Sequel.sqlite
6
+
7
+ class User < Sequel::Model(:user)
8
+ plugin :schema
9
+
10
+ set_schema do
11
+ primary_key :id
12
+
13
+ boolean :online
14
+ varchar :name
15
+ integer :level
16
+ text :description
17
+ date :birthday
18
+ time :created
19
+ end
20
+
21
+ create_table unless table_exists?
22
+ end
23
+
24
+ class FormController < Ramaze::Controller
25
+ map '/'
26
+ helper :sequel_form
27
+
28
+ def new
29
+ sequel_form(User).to_s
30
+ end
31
+
32
+ def new_with_options
33
+ sequel_form(User, :method => :post, :action => r(:create)).to_s
34
+ end
35
+
36
+ def edit(id)
37
+ sequel_form(User[id]).to_s
38
+ end
39
+
40
+ def edit_with_options(id)
41
+ sequel_form(User[id], :method => :post, :action => r(:create)).to_s
42
+ end
43
+ end
44
+
45
+ describe Ramaze::Helper::SequelForm do
46
+ behaves_like :rack_test
47
+
48
+ def hget(uri)
49
+ got = get(uri)
50
+ got.status.should == 200
51
+ Hpricot(got.body)
52
+ end
53
+
54
+ it 'provides forms for model class' do
55
+ form = hget('/new').at(:form)
56
+ (form/:input).size.should == 5
57
+ (form/:input).map{|i| i[:name] }.compact.sort.should == %w[level name online]
58
+ form.at(:textarea)[:name].should == 'description'
59
+ end
60
+
61
+ it 'provides form for model class with options' do
62
+ form = hget('/new_with_options').at(:form)
63
+ form.raw_attributes.should == {'action' => '/create', 'method' => 'post'}
64
+ end
65
+
66
+ data = {
67
+ :name => 'manveru',
68
+ :description => 'Ramaze dev',
69
+ :online => true,
70
+ :level => 2,
71
+ :birthday => Time.now,
72
+ :created => Time.now,
73
+ }
74
+ User.create(data)
75
+
76
+ it 'provides form for instance of model' do
77
+ form = hget('/edit/1').at(:form)
78
+ form.at('input[@name=name]').raw_attributes.should ==
79
+ { 'name' => 'name', 'type' => 'text', 'value' => data[:name] }
80
+ form.at('input[@name=online]').raw_attributes.should ==
81
+ { "name" => "online", "type" => "checkbox", "checked" => "checked",
82
+ "value" => data[:online].to_s }
83
+ form.at('input[@name=level]').raw_attributes.should ==
84
+ { "name" => "level", "type" => "text", "value" => data[:level].to_s }
85
+ end
86
+
87
+ it 'provides form with options for instance of model' do
88
+ hget('/edit_with_options/1').at(:form).raw_attributes.should ==
89
+ {"action" => "/create", "method" => "post"}
90
+ end
91
+ end
@@ -0,0 +1,45 @@
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
+ require 'spec/helper'
5
+
6
+ class SpecSimpleCaptcha < Ramaze::Controller
7
+ helper :simple_captcha
8
+ map '/'
9
+
10
+ def ask_question
11
+ question = simple_captcha
12
+ end
13
+
14
+ def answer_question(with)
15
+ check_captcha(with) ? 'correct' : 'wrong'
16
+ end
17
+ end
18
+
19
+ class SpecCustomCaptcha < SpecSimpleCaptcha
20
+ map '/fish'
21
+
22
+ trait :captcha => lambda{
23
+ ["the answer to everything", 42]
24
+ }
25
+ end
26
+
27
+ describe Ramaze::Helper::SimpleCaptcha do
28
+ behaves_like :rack_test
29
+
30
+ should 'ask question' do
31
+ get('/ask_question')
32
+ question = last_response.body
33
+ question.should =~ /^\d+ [+-] \d+$/
34
+
35
+ lh, m, rh = question.split
36
+ answer = lh.to_i.send(m, rh.to_i)
37
+
38
+ get("/answer_question/#{answer}").body.should == 'correct'
39
+ end
40
+
41
+ should 'ask custom question' do
42
+ get('/fish/ask_question').body.should == 'the answer to everything'
43
+ get('/fish/answer_question/42').body.should == 'correct'
44
+ end
45
+ end
@@ -0,0 +1,86 @@
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
+ require 'spec/helper'
5
+
6
+ class SpecStackHelper < Ramaze::Controller
7
+ map '/'
8
+ helper :stack
9
+ engine :None
10
+
11
+ def logged_in_page
12
+ call(r(:login)) unless logged_in?
13
+ "the logged in page"
14
+ end
15
+
16
+ def logged_in_params
17
+ call(r(:login)) unless logged_in?
18
+ request.params.inspect
19
+ end
20
+
21
+ def secure
22
+ logged_in? ? 'secret content' : 'please login'
23
+ end
24
+
25
+ def login
26
+ session[:logged_in] = true
27
+ answer(r(:secure))
28
+ end
29
+
30
+ def logout
31
+ session.delete(:logged_in)
32
+ end
33
+
34
+ private
35
+
36
+ def logged_in?
37
+ session[:logged_in]
38
+ end
39
+ end
40
+
41
+ describe Ramaze::Helper::Stack do
42
+ behaves_like :rack_test
43
+ @uri = 'http://example.org'
44
+
45
+ should 'login directly' do
46
+ get('/secure').body.should == 'please login'
47
+
48
+ get('/login').status.should == 302
49
+ last_response['Location'].should == "#@uri/secure"
50
+
51
+ get('/secure').status.should == 200
52
+ last_response.body.should == 'secret content'
53
+
54
+ get('/secure').body.should == 'secret content'
55
+ get('/logout')
56
+ get('/secure').body.should == 'please login'
57
+ end
58
+
59
+ should 'login via redirects' do
60
+ get('/logged_in_page').status.should == 302
61
+ last_response['Location'].should == 'http://example.org/login'
62
+
63
+ get('/login').status.should == 302
64
+ last_response['Location'].should == 'http://example.org/logged_in_page'
65
+
66
+ get('/logged_in_page').status.should == 200
67
+ last_response.body.should == 'the logged in page'
68
+
69
+ get('/logout')
70
+ get('/secure').body.should == 'please login'
71
+ end
72
+
73
+ should 'login with params via redirects' do
74
+ get('/logged_in_params?x=y').status.should == 302
75
+ last_response['Location'].should == 'http://example.org/login'
76
+
77
+ get('/login').status.should == 302
78
+ last_response['Location'].should == 'http://example.org/logged_in_params?x=y'
79
+
80
+ get('/logged_in_params?x=y').status.should == 200
81
+ last_response.body.should == {'x' => 'y'}.inspect
82
+
83
+ get('/logout')
84
+ get('/secure').body.should == 'please login'
85
+ end
86
+ end