ptomato-ramaze 2009.02

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (592) hide show
  1. data/README.md +481 -0
  2. data/Rakefile +248 -0
  3. data/benchmark/results.txt +131 -0
  4. data/benchmark/run.rb +362 -0
  5. data/benchmark/suite/minimal.rb +13 -0
  6. data/benchmark/suite/no_informer.rb +9 -0
  7. data/benchmark/suite/no_sessions.rb +10 -0
  8. data/benchmark/suite/no_template.rb +9 -0
  9. data/benchmark/suite/simple.rb +7 -0
  10. data/benchmark/suite/template_amrita2.rb +17 -0
  11. data/benchmark/suite/template_builder.rb +12 -0
  12. data/benchmark/suite/template_erubis.rb +10 -0
  13. data/benchmark/suite/template_ezamar.rb +10 -0
  14. data/benchmark/suite/template_haml.rb +15 -0
  15. data/benchmark/suite/template_liquid.rb +13 -0
  16. data/benchmark/suite/template_markaby.rb +11 -0
  17. data/benchmark/suite/template_nagoro.rb +10 -0
  18. data/benchmark/suite/template_redcloth.rb +15 -0
  19. data/benchmark/suite/template_tenjin.rb +10 -0
  20. data/benchmark/test.rb +35 -0
  21. data/bin/ramaze +80 -0
  22. data/doc/AUTHORS +29 -0
  23. data/doc/CHANGELOG +19530 -0
  24. data/doc/COPYING +56 -0
  25. data/doc/FAQ +92 -0
  26. data/doc/GPL +339 -0
  27. data/doc/INSTALL +92 -0
  28. data/doc/LEGAL +26 -0
  29. data/doc/TODO +29 -0
  30. data/doc/meta/announcement.txt +99 -0
  31. data/doc/meta/configuration.txt +163 -0
  32. data/doc/meta/internals.txt +278 -0
  33. data/doc/meta/users.kml +64 -0
  34. data/doc/readme_chunks/appendix.txt +10 -0
  35. data/doc/readme_chunks/examples.txt +38 -0
  36. data/doc/readme_chunks/features.txt +148 -0
  37. data/doc/readme_chunks/getting_help.txt +5 -0
  38. data/doc/readme_chunks/getting_started.txt +18 -0
  39. data/doc/readme_chunks/installing.txt +92 -0
  40. data/doc/readme_chunks/introduction.txt +18 -0
  41. data/doc/readme_chunks/principles.txt +56 -0
  42. data/doc/readme_chunks/thanks.txt +59 -0
  43. data/doc/tutorial/todolist.html +742 -0
  44. data/doc/tutorial/todolist.mkd +787 -0
  45. data/examples/app/auth/auth.rb +54 -0
  46. data/examples/app/auth/template/layout.haml +20 -0
  47. data/examples/app/auth/template/login.haml +16 -0
  48. data/examples/app/blog/README +3 -0
  49. data/examples/app/blog/controller/main.rb +29 -0
  50. data/examples/app/blog/model/entry.rb +30 -0
  51. data/examples/app/blog/public/styles/blog.css +132 -0
  52. data/examples/app/blog/spec/blog.rb +87 -0
  53. data/examples/app/blog/start.rb +7 -0
  54. data/examples/app/blog/view/edit.xhtml +17 -0
  55. data/examples/app/blog/view/index.xhtml +17 -0
  56. data/examples/app/blog/view/layout.xhtml +11 -0
  57. data/examples/app/blog/view/new.xhtml +16 -0
  58. data/examples/app/chat/model/history.rb +36 -0
  59. data/examples/app/chat/model/message.rb +7 -0
  60. data/examples/app/chat/public/css/chat.css +13 -0
  61. data/examples/app/chat/public/js/chat.js +22 -0
  62. data/examples/app/chat/public/js/jquery.js +3436 -0
  63. data/examples/app/chat/start.rb +40 -0
  64. data/examples/app/chat/view/chat.xhtml +9 -0
  65. data/examples/app/chat/view/index.xhtml +7 -0
  66. data/examples/app/chat/view/layout.xhtml +13 -0
  67. data/examples/app/localization/start.rb +35 -0
  68. data/examples/app/rapaste/Rakefile +34 -0
  69. data/examples/app/rapaste/controller/paste.rb +101 -0
  70. data/examples/app/rapaste/model/paste.rb +58 -0
  71. data/examples/app/rapaste/public/css/active4d.css +114 -0
  72. data/examples/app/rapaste/public/css/all_hallows_eve.css +72 -0
  73. data/examples/app/rapaste/public/css/amy.css +147 -0
  74. data/examples/app/rapaste/public/css/blackboard.css +88 -0
  75. data/examples/app/rapaste/public/css/brilliance_black.css +605 -0
  76. data/examples/app/rapaste/public/css/brilliance_dull.css +599 -0
  77. data/examples/app/rapaste/public/css/cobalt.css +149 -0
  78. data/examples/app/rapaste/public/css/dawn.css +121 -0
  79. data/examples/app/rapaste/public/css/display.css +197 -0
  80. data/examples/app/rapaste/public/css/eiffel.css +121 -0
  81. data/examples/app/rapaste/public/css/espresso_libre.css +109 -0
  82. data/examples/app/rapaste/public/css/idle.css +62 -0
  83. data/examples/app/rapaste/public/css/iplastic.css +80 -0
  84. data/examples/app/rapaste/public/css/lazy.css +73 -0
  85. data/examples/app/rapaste/public/css/mac_classic.css +123 -0
  86. data/examples/app/rapaste/public/css/magicwb_amiga.css +104 -0
  87. data/examples/app/rapaste/public/css/pastels_on_dark.css +188 -0
  88. data/examples/app/rapaste/public/css/slush_poppies.css +85 -0
  89. data/examples/app/rapaste/public/css/spacecadet.css +51 -0
  90. data/examples/app/rapaste/public/css/sunburst.css +180 -0
  91. data/examples/app/rapaste/public/css/twilight.css +137 -0
  92. data/examples/app/rapaste/public/css/zenburnesque.css +91 -0
  93. data/examples/app/rapaste/public/js/jquery.js +11 -0
  94. data/examples/app/rapaste/spec/rapaste.rb +51 -0
  95. data/examples/app/rapaste/start.rb +25 -0
  96. data/examples/app/rapaste/view/copy.xhtml +10 -0
  97. data/examples/app/rapaste/view/index.xhtml +9 -0
  98. data/examples/app/rapaste/view/layout.xhtml +25 -0
  99. data/examples/app/rapaste/view/list.xhtml +29 -0
  100. data/examples/app/rapaste/view/search.xhtml +41 -0
  101. data/examples/app/rapaste/view/view.xhtml +40 -0
  102. data/examples/app/sourceview/public/coderay.css +104 -0
  103. data/examples/app/sourceview/public/images/file.gif +0 -0
  104. data/examples/app/sourceview/public/images/folder.gif +0 -0
  105. data/examples/app/sourceview/public/images/tv-collapsable-last.gif +0 -0
  106. data/examples/app/sourceview/public/images/tv-collapsable.gif +0 -0
  107. data/examples/app/sourceview/public/images/tv-expandable-last.gif +0 -0
  108. data/examples/app/sourceview/public/images/tv-expandable.gif +0 -0
  109. data/examples/app/sourceview/public/images/tv-item-last.gif +0 -0
  110. data/examples/app/sourceview/public/images/tv-item.gif +0 -0
  111. data/examples/app/sourceview/public/jquery.js +11 -0
  112. data/examples/app/sourceview/public/jquery.treeview.css +48 -0
  113. data/examples/app/sourceview/public/jquery.treeview.js +223 -0
  114. data/examples/app/sourceview/public/sourceview.js +52 -0
  115. data/examples/app/sourceview/sourceview.rb +77 -0
  116. data/examples/app/sourceview/template/index.haml +59 -0
  117. data/examples/app/todolist/README +1 -0
  118. data/examples/app/todolist/public/favicon.ico +0 -0
  119. data/examples/app/todolist/public/js/jquery.js +1923 -0
  120. data/examples/app/todolist/public/ramaze.png +0 -0
  121. data/examples/app/todolist/spec/todolist.rb +132 -0
  122. data/examples/app/todolist/src/controller/main.rb +70 -0
  123. data/examples/app/todolist/src/element/page.rb +31 -0
  124. data/examples/app/todolist/src/model.rb +14 -0
  125. data/examples/app/todolist/start.rb +11 -0
  126. data/examples/app/todolist/template/index.xhtml +17 -0
  127. data/examples/app/todolist/template/new.xhtml +7 -0
  128. data/examples/app/upload/start.rb +19 -0
  129. data/examples/app/upload/view/index.xhtml +25 -0
  130. data/examples/app/whywiki/spec/whywiki.rb +58 -0
  131. data/examples/app/whywiki/start.rb +46 -0
  132. data/examples/app/whywiki/template/edit.xhtml +14 -0
  133. data/examples/app/whywiki/template/show.xhtml +18 -0
  134. data/examples/app/wikore/spec/wikore.rb +111 -0
  135. data/examples/app/wikore/src/controller.rb +80 -0
  136. data/examples/app/wikore/src/model.rb +53 -0
  137. data/examples/app/wikore/start.rb +9 -0
  138. data/examples/app/wikore/template/index.xhtml +8 -0
  139. data/examples/app/wiktacular/README +2 -0
  140. data/examples/app/wiktacular/mkd/link/2007-07-20_19-45-51.mkd +1 -0
  141. data/examples/app/wiktacular/mkd/link/current.mkd +1 -0
  142. data/examples/app/wiktacular/mkd/main/2007-07-20_16-31-33.mkd +1 -0
  143. data/examples/app/wiktacular/mkd/main/2007-07-20_19-21-12.mkd +1 -0
  144. data/examples/app/wiktacular/mkd/main/2007-07-20_19-23-10.mkd +2 -0
  145. data/examples/app/wiktacular/mkd/main/2007-07-20_19-45-07.mkd +2 -0
  146. data/examples/app/wiktacular/mkd/main/current.mkd +2 -0
  147. data/examples/app/wiktacular/mkd/markdown/current.mkd +3 -0
  148. data/examples/app/wiktacular/mkd/testing/2007-07-20_16-43-46.mkd +2 -0
  149. data/examples/app/wiktacular/mkd/testing/2007-07-20_19-43-50.mkd +3 -0
  150. data/examples/app/wiktacular/mkd/testing/2007-07-21_18-46-01.mkd +11 -0
  151. data/examples/app/wiktacular/mkd/testing/2007-07-21_18-46-32.mkd +13 -0
  152. data/examples/app/wiktacular/mkd/testing/2007-07-21_18-47-08.mkd +17 -0
  153. data/examples/app/wiktacular/mkd/testing/2007-07-21_18-47-54.mkd +17 -0
  154. data/examples/app/wiktacular/mkd/testing/current.mkd +17 -0
  155. data/examples/app/wiktacular/public/favicon.ico +0 -0
  156. data/examples/app/wiktacular/public/screen.css +72 -0
  157. data/examples/app/wiktacular/spec/wiktacular.rb +157 -0
  158. data/examples/app/wiktacular/src/controller.rb +55 -0
  159. data/examples/app/wiktacular/src/model.rb +102 -0
  160. data/examples/app/wiktacular/start.rb +8 -0
  161. data/examples/app/wiktacular/template/edit.xhtml +6 -0
  162. data/examples/app/wiktacular/template/html_layout.xhtml +27 -0
  163. data/examples/app/wiktacular/template/index.xhtml +9 -0
  164. data/examples/app/wiktacular/template/new.xhtml +6 -0
  165. data/examples/basic/element.rb +45 -0
  166. data/examples/basic/gestalt.rb +27 -0
  167. data/examples/basic/hello.rb +15 -0
  168. data/examples/basic/layout.rb +28 -0
  169. data/examples/basic/linking.rb +29 -0
  170. data/examples/basic/partial.rb +28 -0
  171. data/examples/basic/simple.rb +56 -0
  172. data/examples/helpers/cache.rb +31 -0
  173. data/examples/helpers/form_with_sequel.rb +24 -0
  174. data/examples/helpers/httpdigest.rb +108 -0
  175. data/examples/helpers/identity.rb +18 -0
  176. data/examples/helpers/nitro_form.rb +23 -0
  177. data/examples/helpers/paginate.rb +71 -0
  178. data/examples/helpers/provide.rb +23 -0
  179. data/examples/helpers/rest.rb +28 -0
  180. data/examples/helpers/simple_captcha.rb +29 -0
  181. data/examples/misc/css.rb +37 -0
  182. data/examples/misc/facebook.rb +159 -0
  183. data/examples/misc/memleak_detector.rb +32 -0
  184. data/examples/misc/nagoro_element.rb +43 -0
  185. data/examples/misc/ramaise.rb +132 -0
  186. data/examples/misc/rapp.rb +45 -0
  187. data/examples/misc/sequel_scaffolding.rb +34 -0
  188. data/examples/misc/simple_auth.rb +35 -0
  189. data/examples/templates/template/external.amrita +19 -0
  190. data/examples/templates/template/external.haml +22 -0
  191. data/examples/templates/template/external.liquid +28 -0
  192. data/examples/templates/template/external.mab +30 -0
  193. data/examples/templates/template/external.nag +28 -0
  194. data/examples/templates/template/external.redcloth +19 -0
  195. data/examples/templates/template/external.rem +30 -0
  196. data/examples/templates/template/external.rhtml +28 -0
  197. data/examples/templates/template/external.tenjin +28 -0
  198. data/examples/templates/template/external.xsl +57 -0
  199. data/examples/templates/template/external.zmr +28 -0
  200. data/examples/templates/template_amrita2.rb +74 -0
  201. data/examples/templates/template_erubis.rb +53 -0
  202. data/examples/templates/template_ezamar.rb +50 -0
  203. data/examples/templates/template_haml.rb +50 -0
  204. data/examples/templates/template_liquid.rb +65 -0
  205. data/examples/templates/template_markaby.rb +58 -0
  206. data/examples/templates/template_nagoro.rb +51 -0
  207. data/examples/templates/template_redcloth.rb +59 -0
  208. data/examples/templates/template_remarkably.rb +55 -0
  209. data/examples/templates/template_tenjin.rb +53 -0
  210. data/examples/templates/template_xslt.rb +49 -0
  211. data/lib/proto/controller/init.rb +11 -0
  212. data/lib/proto/controller/main.rb +20 -0
  213. data/lib/proto/model/init.rb +4 -0
  214. data/lib/proto/public/.htaccess +24 -0
  215. data/lib/proto/public/css/ramaze_error.css +90 -0
  216. data/lib/proto/public/dispatch.fcgi +11 -0
  217. data/lib/proto/public/favicon.ico +0 -0
  218. data/lib/proto/public/js/jquery.js +3549 -0
  219. data/lib/proto/public/ramaze.png +0 -0
  220. data/lib/proto/spec/main.rb +25 -0
  221. data/lib/proto/start.rb +12 -0
  222. data/lib/proto/start.ru +16 -0
  223. data/lib/proto/view/error.xhtml +64 -0
  224. data/lib/proto/view/index.xhtml +34 -0
  225. data/lib/proto/view/page.xhtml +27 -0
  226. data/lib/ramaze/action/render.rb +192 -0
  227. data/lib/ramaze/action.rb +159 -0
  228. data/lib/ramaze/adapter/base.rb +128 -0
  229. data/lib/ramaze/adapter/cgi.rb +20 -0
  230. data/lib/ramaze/adapter/ebb.rb +18 -0
  231. data/lib/ramaze/adapter/evented_mongrel.rb +7 -0
  232. data/lib/ramaze/adapter/fake.rb +12 -0
  233. data/lib/ramaze/adapter/fcgi.rb +18 -0
  234. data/lib/ramaze/adapter/lsws.rb +19 -0
  235. data/lib/ramaze/adapter/mongrel.rb +21 -0
  236. data/lib/ramaze/adapter/scgi.rb +18 -0
  237. data/lib/ramaze/adapter/swiftiplied_mongrel.rb +7 -0
  238. data/lib/ramaze/adapter/thin.rb +17 -0
  239. data/lib/ramaze/adapter/webrick.rb +43 -0
  240. data/lib/ramaze/adapter.rb +97 -0
  241. data/lib/ramaze/cache/file.rb +71 -0
  242. data/lib/ramaze/cache/memcached.rb +69 -0
  243. data/lib/ramaze/cache/memory.rb +6 -0
  244. data/lib/ramaze/cache/yaml_store.rb +68 -0
  245. data/lib/ramaze/cache.rb +114 -0
  246. data/lib/ramaze/contrib/email.rb +86 -0
  247. data/lib/ramaze/contrib/facebook/facebook.rb +171 -0
  248. data/lib/ramaze/contrib/facebook.rb +23 -0
  249. data/lib/ramaze/contrib/file_cache.rb +3 -0
  250. data/lib/ramaze/contrib/gems.rb +78 -0
  251. data/lib/ramaze/contrib/gettext/mo.rb +155 -0
  252. data/lib/ramaze/contrib/gettext/parser.rb +46 -0
  253. data/lib/ramaze/contrib/gettext/po.rb +109 -0
  254. data/lib/ramaze/contrib/gettext.rb +113 -0
  255. data/lib/ramaze/contrib/gzip_filter.rb +69 -0
  256. data/lib/ramaze/contrib/maruku_uv.rb +59 -0
  257. data/lib/ramaze/contrib/profiling.rb +36 -0
  258. data/lib/ramaze/contrib/rest.rb +17 -0
  259. data/lib/ramaze/contrib/sequel/create_join.rb +25 -0
  260. data/lib/ramaze/contrib/sequel/fill.rb +12 -0
  261. data/lib/ramaze/contrib/sequel/form_field.rb +129 -0
  262. data/lib/ramaze/contrib/sequel/image.rb +198 -0
  263. data/lib/ramaze/contrib/sequel/relation.rb +82 -0
  264. data/lib/ramaze/contrib/sequel_cache.rb +92 -0
  265. data/lib/ramaze/contrib.rb +82 -0
  266. data/lib/ramaze/controller/error.rb +46 -0
  267. data/lib/ramaze/controller/main.rb +2 -0
  268. data/lib/ramaze/controller/resolve.rb +278 -0
  269. data/lib/ramaze/controller.rb +288 -0
  270. data/lib/ramaze/current/request.rb +231 -0
  271. data/lib/ramaze/current/response.rb +37 -0
  272. data/lib/ramaze/current/session/flash.rb +88 -0
  273. data/lib/ramaze/current/session/hash.rb +62 -0
  274. data/lib/ramaze/current/session.rb +179 -0
  275. data/lib/ramaze/current.rb +51 -0
  276. data/lib/ramaze/dispatcher/action.rb +50 -0
  277. data/lib/ramaze/dispatcher/directory.rb +119 -0
  278. data/lib/ramaze/dispatcher/error.rb +108 -0
  279. data/lib/ramaze/dispatcher/file.rb +100 -0
  280. data/lib/ramaze/dispatcher.rb +145 -0
  281. data/lib/ramaze/error.rb +24 -0
  282. data/lib/ramaze/gestalt.rb +124 -0
  283. data/lib/ramaze/helper/aspect.rb +106 -0
  284. data/lib/ramaze/helper/auth.rb +125 -0
  285. data/lib/ramaze/helper/bench.rb +43 -0
  286. data/lib/ramaze/helper/cache.rb +140 -0
  287. data/lib/ramaze/helper/cgi.rb +39 -0
  288. data/lib/ramaze/helper/flash.rb +74 -0
  289. data/lib/ramaze/helper/form.rb +284 -0
  290. data/lib/ramaze/helper/formatting.rb +162 -0
  291. data/lib/ramaze/helper/gestalt.rb +15 -0
  292. data/lib/ramaze/helper/gravatar.rb +32 -0
  293. data/lib/ramaze/helper/httpdigest.rb +88 -0
  294. data/lib/ramaze/helper/identity.rb +119 -0
  295. data/lib/ramaze/helper/link.rb +122 -0
  296. data/lib/ramaze/helper/markaby.rb +31 -0
  297. data/lib/ramaze/helper/maruku.rb +9 -0
  298. data/lib/ramaze/helper/nitroform.rb +14 -0
  299. data/lib/ramaze/helper/pager.rb +366 -0
  300. data/lib/ramaze/helper/paginate.rb +233 -0
  301. data/lib/ramaze/helper/partial.rb +105 -0
  302. data/lib/ramaze/helper/redirect.rb +100 -0
  303. data/lib/ramaze/helper/rest.rb +43 -0
  304. data/lib/ramaze/helper/sendfile.rb +16 -0
  305. data/lib/ramaze/helper/sequel.rb +55 -0
  306. data/lib/ramaze/helper/simple_captcha.rb +31 -0
  307. data/lib/ramaze/helper/stack.rb +77 -0
  308. data/lib/ramaze/helper/tagz.rb +19 -0
  309. data/lib/ramaze/helper/thread.rb +17 -0
  310. data/lib/ramaze/helper/ultraviolet.rb +44 -0
  311. data/lib/ramaze/helper/user.rb +110 -0
  312. data/lib/ramaze/helper/xhtml.rb +23 -0
  313. data/lib/ramaze/helper.rb +87 -0
  314. data/lib/ramaze/log/analogger.rb +40 -0
  315. data/lib/ramaze/log/growl.rb +38 -0
  316. data/lib/ramaze/log/hub.rb +41 -0
  317. data/lib/ramaze/log/informer.rb +128 -0
  318. data/lib/ramaze/log/knotify.rb +28 -0
  319. data/lib/ramaze/log/logger.rb +26 -0
  320. data/lib/ramaze/log/logging.rb +89 -0
  321. data/lib/ramaze/log/rotatinginformer.rb +168 -0
  322. data/lib/ramaze/log/syslog.rb +51 -0
  323. data/lib/ramaze/log/xosd.rb +92 -0
  324. data/lib/ramaze/log.rb +27 -0
  325. data/lib/ramaze/option/dsl.rb +45 -0
  326. data/lib/ramaze/option/holder.rb +131 -0
  327. data/lib/ramaze/option/merger.rb +108 -0
  328. data/lib/ramaze/option.rb +156 -0
  329. data/lib/ramaze/reloader/watch_inotify.rb +85 -0
  330. data/lib/ramaze/reloader/watch_stat.rb +58 -0
  331. data/lib/ramaze/reloader.rb +170 -0
  332. data/lib/ramaze/route.rb +97 -0
  333. data/lib/ramaze/setup.rb +50 -0
  334. data/lib/ramaze/snippets/array/put_within.rb +44 -0
  335. data/lib/ramaze/snippets/binding/locals.rb +25 -0
  336. data/lib/ramaze/snippets/blankslate.rb +7 -0
  337. data/lib/ramaze/snippets/dictionary.rb +504 -0
  338. data/lib/ramaze/snippets/divide.rb +22 -0
  339. data/lib/ramaze/snippets/fiber.rb +63 -0
  340. data/lib/ramaze/snippets/kernel/constant.rb +41 -0
  341. data/lib/ramaze/snippets/kernel/pretty_inspect.rb +21 -0
  342. data/lib/ramaze/snippets/metaid.rb +17 -0
  343. data/lib/ramaze/snippets/numeric/filesize_format.rb +32 -0
  344. data/lib/ramaze/snippets/numeric/time.rb +63 -0
  345. data/lib/ramaze/snippets/object/__dir__.rb +29 -0
  346. data/lib/ramaze/snippets/object/acquire.rb +37 -0
  347. data/lib/ramaze/snippets/object/instance_variable_defined.rb +19 -0
  348. data/lib/ramaze/snippets/object/pretty.rb +16 -0
  349. data/lib/ramaze/snippets/object/scope.rb +18 -0
  350. data/lib/ramaze/snippets/object/traits.rb +76 -0
  351. data/lib/ramaze/snippets/ordered_set.rb +51 -0
  352. data/lib/ramaze/snippets/proc/locals.rb +19 -0
  353. data/lib/ramaze/snippets/ramaze/acquire.rb +31 -0
  354. data/lib/ramaze/snippets/ramaze/caller_info.rb +30 -0
  355. data/lib/ramaze/snippets/ramaze/caller_lines.rb +51 -0
  356. data/lib/ramaze/snippets/ramaze/deprecated.rb +21 -0
  357. data/lib/ramaze/snippets/ramaze/fiber.rb +24 -0
  358. data/lib/ramaze/snippets/ramaze/state.rb +86 -0
  359. data/lib/ramaze/snippets/ramaze/struct.rb +45 -0
  360. data/lib/ramaze/snippets/string/camel_case.rb +21 -0
  361. data/lib/ramaze/snippets/string/color.rb +31 -0
  362. data/lib/ramaze/snippets/string/each.rb +19 -0
  363. data/lib/ramaze/snippets/string/end_with.rb +20 -0
  364. data/lib/ramaze/snippets/string/esc.rb +34 -0
  365. data/lib/ramaze/snippets/string/ord.rb +21 -0
  366. data/lib/ramaze/snippets/string/snake_case.rb +21 -0
  367. data/lib/ramaze/snippets/string/start_with.rb +19 -0
  368. data/lib/ramaze/snippets/string/unindent.rb +28 -0
  369. data/lib/ramaze/snippets/thread/into.rb +18 -0
  370. data/lib/ramaze/snippets.rb +22 -0
  371. data/lib/ramaze/spec/helper/bacon.rb +7 -0
  372. data/lib/ramaze/spec/helper/browser.rb +88 -0
  373. data/lib/ramaze/spec/helper/mock_http.rb +64 -0
  374. data/lib/ramaze/spec/helper/pretty_output.rb +82 -0
  375. data/lib/ramaze/spec/helper/requester.rb +63 -0
  376. data/lib/ramaze/spec/helper/simple_http.rb +434 -0
  377. data/lib/ramaze/spec/helper/snippets.rb +14 -0
  378. data/lib/ramaze/spec/helper.rb +135 -0
  379. data/lib/ramaze/spec.rb +1 -0
  380. data/lib/ramaze/store/default.rb +109 -0
  381. data/lib/ramaze/template/amrita2.rb +49 -0
  382. data/lib/ramaze/template/builder.rb +28 -0
  383. data/lib/ramaze/template/erubis.rb +41 -0
  384. data/lib/ramaze/template/ezamar/element.rb +169 -0
  385. data/lib/ramaze/template/ezamar/engine.rb +76 -0
  386. data/lib/ramaze/template/ezamar/morpher.rb +135 -0
  387. data/lib/ramaze/template/ezamar/render_partial.rb +39 -0
  388. data/lib/ramaze/template/ezamar/textpow.syntax +34 -0
  389. data/lib/ramaze/template/ezamar.rb +42 -0
  390. data/lib/ramaze/template/haml.rb +37 -0
  391. data/lib/ramaze/template/liquid.rb +36 -0
  392. data/lib/ramaze/template/markaby.rb +52 -0
  393. data/lib/ramaze/template/maruku.rb +34 -0
  394. data/lib/ramaze/template/nagoro.rb +52 -0
  395. data/lib/ramaze/template/none.rb +14 -0
  396. data/lib/ramaze/template/redcloth.rb +25 -0
  397. data/lib/ramaze/template/remarkably.rb +38 -0
  398. data/lib/ramaze/template/sass.rb +38 -0
  399. data/lib/ramaze/template/tagz.rb +79 -0
  400. data/lib/ramaze/template/tenjin.rb +74 -0
  401. data/lib/ramaze/template/xslt.rb +100 -0
  402. data/lib/ramaze/template.rb +87 -0
  403. data/lib/ramaze/tool/create.rb +48 -0
  404. data/lib/ramaze/tool/daemonize.rb +37 -0
  405. data/lib/ramaze/tool/localize.rb +202 -0
  406. data/lib/ramaze/tool/mime.rb +35 -0
  407. data/lib/ramaze/tool/mime_types.yaml +615 -0
  408. data/lib/ramaze/tool/project_creator.rb +111 -0
  409. data/lib/ramaze/tool/record.rb +6 -0
  410. data/lib/ramaze/tool.rb +9 -0
  411. data/lib/ramaze/trinity.rb +16 -0
  412. data/lib/ramaze/version.rb +6 -0
  413. data/lib/ramaze.rb +139 -0
  414. data/lib/vendor/bacon.rb +323 -0
  415. data/rake_tasks/conf.rake +71 -0
  416. data/rake_tasks/coverage.rake +45 -0
  417. data/rake_tasks/gem.rake +74 -0
  418. data/rake_tasks/git.rake +41 -0
  419. data/rake_tasks/maintenance.rake +386 -0
  420. data/rake_tasks/metric.rake +24 -0
  421. data/rake_tasks/release.rake +76 -0
  422. data/rake_tasks/spec.rake +61 -0
  423. data/ramaze.gemspec +611 -0
  424. data/spec/contrib/profiling.rb +29 -0
  425. data/spec/contrib/sequel/fill.rb +47 -0
  426. data/spec/examples/caching.rb +19 -0
  427. data/spec/examples/css.rb +15 -0
  428. data/spec/examples/element.rb +15 -0
  429. data/spec/examples/hello.rb +11 -0
  430. data/spec/examples/linking.rb +18 -0
  431. data/spec/examples/simple.rb +45 -0
  432. data/spec/examples/simple_auth.rb +32 -0
  433. data/spec/examples/templates/template_amrita2.rb +16 -0
  434. data/spec/examples/templates/template_erubis.rb +23 -0
  435. data/spec/examples/templates/template_ezamar.rb +23 -0
  436. data/spec/examples/templates/template_haml.rb +23 -0
  437. data/spec/examples/templates/template_liquid.rb +29 -0
  438. data/spec/examples/templates/template_markaby.rb +23 -0
  439. data/spec/examples/templates/template_redcloth.rb +28 -0
  440. data/spec/examples/templates/template_remarkably.rb +23 -0
  441. data/spec/examples/templates/template_tenjin.rb +28 -0
  442. data/spec/helper.rb +3 -0
  443. data/spec/ramaze/action/basics.rb +36 -0
  444. data/spec/ramaze/action/cache.rb +87 -0
  445. data/spec/ramaze/action/file_cache.rb +70 -0
  446. data/spec/ramaze/action/layout.rb +190 -0
  447. data/spec/ramaze/action/render.rb +31 -0
  448. data/spec/ramaze/action/view/bar.xhtml +1 -0
  449. data/spec/ramaze/action/view/instancevars/layout.xhtml +1 -0
  450. data/spec/ramaze/action/view/other_wrapper.xhtml +1 -0
  451. data/spec/ramaze/action/view/single_wrapper.xhtml +1 -0
  452. data/spec/ramaze/action/view/sub/sub_wrapper.xhtml +1 -0
  453. data/spec/ramaze/adapter/ebb.rb +12 -0
  454. data/spec/ramaze/adapter/mongrel.rb +12 -0
  455. data/spec/ramaze/adapter/record.rb +31 -0
  456. data/spec/ramaze/adapter/webrick.rb +12 -0
  457. data/spec/ramaze/adapter.rb +49 -0
  458. data/spec/ramaze/cache.rb +140 -0
  459. data/spec/ramaze/controller/actionless_templates.rb +32 -0
  460. data/spec/ramaze/controller/resolve.rb +32 -0
  461. data/spec/ramaze/controller/subclass.rb +36 -0
  462. data/spec/ramaze/controller/template_resolving.rb +113 -0
  463. data/spec/ramaze/controller/view/bar.xhtml +1 -0
  464. data/spec/ramaze/controller/view/base/another.xhtml +1 -0
  465. data/spec/ramaze/controller/view/greet.xhtml +1 -0
  466. data/spec/ramaze/controller/view/list.xhtml +1 -0
  467. data/spec/ramaze/controller/view/other/greet/other.xhtml +1 -0
  468. data/spec/ramaze/controller/view/other_wrapper.xhtml +1 -0
  469. data/spec/ramaze/controller.rb +180 -0
  470. data/spec/ramaze/current/request.rb +30 -0
  471. data/spec/ramaze/current/session.rb +97 -0
  472. data/spec/ramaze/dispatcher/directory.rb +55 -0
  473. data/spec/ramaze/dispatcher/file.rb +60 -0
  474. data/spec/ramaze/dispatcher/public/favicon.ico +0 -0
  475. data/spec/ramaze/dispatcher/public/file name.txt +1 -0
  476. data/spec/ramaze/dispatcher/public/test_download.css +141 -0
  477. data/spec/ramaze/dispatcher.rb +31 -0
  478. data/spec/ramaze/element.rb +107 -0
  479. data/spec/ramaze/error.rb +94 -0
  480. data/spec/ramaze/gestalt.rb +131 -0
  481. data/spec/ramaze/helper/aspect.rb +101 -0
  482. data/spec/ramaze/helper/auth.rb +66 -0
  483. data/spec/ramaze/helper/cache.rb +160 -0
  484. data/spec/ramaze/helper/cgi.rb +43 -0
  485. data/spec/ramaze/helper/file.rb +18 -0
  486. data/spec/ramaze/helper/flash.rb +133 -0
  487. data/spec/ramaze/helper/form.rb +118 -0
  488. data/spec/ramaze/helper/formatting.rb +54 -0
  489. data/spec/ramaze/helper/link.rb +124 -0
  490. data/spec/ramaze/helper/pager.rb +99 -0
  491. data/spec/ramaze/helper/partial.rb +88 -0
  492. data/spec/ramaze/helper/redirect.rb +112 -0
  493. data/spec/ramaze/helper/simple_captcha.rb +22 -0
  494. data/spec/ramaze/helper/stack.rb +73 -0
  495. data/spec/ramaze/helper/user.rb +43 -0
  496. data/spec/ramaze/helper/view/locals.xhtml +1 -0
  497. data/spec/ramaze/helper/view/loop.xhtml +4 -0
  498. data/spec/ramaze/helper/view/num.xhtml +1 -0
  499. data/spec/ramaze/helper/view/partial.xhtml +1 -0
  500. data/spec/ramaze/helper/view/recursive.xhtml +8 -0
  501. data/spec/ramaze/helper/view/recursive_local_ivars.xhtml +7 -0
  502. data/spec/ramaze/helper/view/recursive_locals.xhtml +7 -0
  503. data/spec/ramaze/helper/view/test_template.xhtml +1 -0
  504. data/spec/ramaze/localize.rb +89 -0
  505. data/spec/ramaze/log/informer.rb +72 -0
  506. data/spec/ramaze/log/syslog.rb +76 -0
  507. data/spec/ramaze/morpher.rb +111 -0
  508. data/spec/ramaze/params.rb +157 -0
  509. data/spec/ramaze/public/error404.xhtml +1 -0
  510. data/spec/ramaze/public/favicon.ico +0 -0
  511. data/spec/ramaze/public/ramaze.png +0 -0
  512. data/spec/ramaze/public/test_download.css +141 -0
  513. data/spec/ramaze/request/ebb.rb +9 -0
  514. data/spec/ramaze/request/mongrel.rb +9 -0
  515. data/spec/ramaze/request/thin.rb +9 -0
  516. data/spec/ramaze/request/webrick.rb +5 -0
  517. data/spec/ramaze/request.rb +185 -0
  518. data/spec/ramaze/rewrite/file.css +1 -0
  519. data/spec/ramaze/rewrite.rb +36 -0
  520. data/spec/ramaze/route.rb +131 -0
  521. data/spec/ramaze/session.rb +94 -0
  522. data/spec/ramaze/store/default.rb +71 -0
  523. data/spec/ramaze/struct.rb +47 -0
  524. data/spec/ramaze/template/amrita2/external.amrita +6 -0
  525. data/spec/ramaze/template/amrita2/sum.amrita +1 -0
  526. data/spec/ramaze/template/amrita2.rb +50 -0
  527. data/spec/ramaze/template/builder/external.rxml +3 -0
  528. data/spec/ramaze/template/builder.rb +51 -0
  529. data/spec/ramaze/template/erubis/sum.rhtml +1 -0
  530. data/spec/ramaze/template/erubis.rb +41 -0
  531. data/spec/ramaze/template/ezamar/another/long/action.zmr +1 -0
  532. data/spec/ramaze/template/ezamar/combined.zmr +1 -0
  533. data/spec/ramaze/template/ezamar/file_only.zmr +1 -0
  534. data/spec/ramaze/template/ezamar/index.zmr +1 -0
  535. data/spec/ramaze/template/ezamar/nested.zmr +1 -0
  536. data/spec/ramaze/template/ezamar/other__index.xhtml +1 -0
  537. data/spec/ramaze/template/ezamar/some__long__action.zmr +1 -0
  538. data/spec/ramaze/template/ezamar/sum.zmr +1 -0
  539. data/spec/ramaze/template/ezamar.rb +63 -0
  540. data/spec/ramaze/template/haml/index.haml +5 -0
  541. data/spec/ramaze/template/haml/locals.haml +2 -0
  542. data/spec/ramaze/template/haml/with_vars.haml +4 -0
  543. data/spec/ramaze/template/haml.rb +66 -0
  544. data/spec/ramaze/template/liquid/index.liquid +1 -0
  545. data/spec/ramaze/template/liquid/products.liquid +45 -0
  546. data/spec/ramaze/template/liquid.rb +99 -0
  547. data/spec/ramaze/template/markaby/external.mab +8 -0
  548. data/spec/ramaze/template/markaby/sum.mab +1 -0
  549. data/spec/ramaze/template/markaby.rb +61 -0
  550. data/spec/ramaze/template/nagoro/another/long/action.nag +1 -0
  551. data/spec/ramaze/template/nagoro/combined.nag +1 -0
  552. data/spec/ramaze/template/nagoro/file_only.nag +1 -0
  553. data/spec/ramaze/template/nagoro/index.nag +1 -0
  554. data/spec/ramaze/template/nagoro/nested.nag +1 -0
  555. data/spec/ramaze/template/nagoro/some__long__action.nag +1 -0
  556. data/spec/ramaze/template/nagoro/sum.nag +1 -0
  557. data/spec/ramaze/template/nagoro.rb +64 -0
  558. data/spec/ramaze/template/ramaze/external.test +1 -0
  559. data/spec/ramaze/template/redcloth/external.redcloth +1 -0
  560. data/spec/ramaze/template/redcloth.rb +38 -0
  561. data/spec/ramaze/template/remarkably/external.rem +8 -0
  562. data/spec/ramaze/template/remarkably/sum.rem +1 -0
  563. data/spec/ramaze/template/remarkably.rb +58 -0
  564. data/spec/ramaze/template/sass/file.css.sass +5 -0
  565. data/spec/ramaze/template/sass.rb +70 -0
  566. data/spec/ramaze/template/tagz/external.tagz +8 -0
  567. data/spec/ramaze/template/tagz/sum.tagz +1 -0
  568. data/spec/ramaze/template/tagz.rb +62 -0
  569. data/spec/ramaze/template/tenjin/external.tenjin +1 -0
  570. data/spec/ramaze/template/tenjin.rb +47 -0
  571. data/spec/ramaze/template/xslt/concat_words.xsl +16 -0
  572. data/spec/ramaze/template/xslt/index.xsl +14 -0
  573. data/spec/ramaze/template/xslt/products.xsl +32 -0
  574. data/spec/ramaze/template/xslt/ruby_version.xsl +14 -0
  575. data/spec/ramaze/template/xslt.rb +90 -0
  576. data/spec/ramaze/template.rb +128 -0
  577. data/spec/snippets/array/put_within.rb +33 -0
  578. data/spec/snippets/binding/locals.rb +9 -0
  579. data/spec/snippets/kernel/constant.rb +23 -0
  580. data/spec/snippets/numeric/filesize_format.rb +12 -0
  581. data/spec/snippets/numeric/time.rb +12 -0
  582. data/spec/snippets/object/__dir__.rb +14 -0
  583. data/spec/snippets/ordered_set.rb +63 -0
  584. data/spec/snippets/ramaze/acquire.rb +77 -0
  585. data/spec/snippets/ramaze/caller_info.rb +39 -0
  586. data/spec/snippets/ramaze/caller_lines.rb +30 -0
  587. data/spec/snippets/string/camel_case.rb +25 -0
  588. data/spec/snippets/string/color.rb +11 -0
  589. data/spec/snippets/string/snake_case.rb +24 -0
  590. data/spec/snippets/string/unindent.rb +43 -0
  591. data/spec/snippets/thread/into.rb +20 -0
  592. metadata +661 -0
@@ -0,0 +1,97 @@
1
+ # Copyright (c) 2008 Michael Fellinger m.fellinger@gmail.com
2
+ # All files in this distribution are subject to the terms of the Ruby license.
3
+
4
+ module Ramaze
5
+
6
+ # Ramaze support simple routing using string, regex and lambda based routers.
7
+ # Route are stored in a dictionary, which supports hash-like access but
8
+ # preserves order, so routes are evaluated in the order they are added.
9
+ #
10
+ # String routers are the simplest way to route in Ramaze. One path is
11
+ # translated into another:
12
+ #
13
+ # Ramaze::Route[ '/foo' ] = '/bar'
14
+ # '/foo' => '/bar'
15
+ #
16
+ # Regex routers allow matching against paths using regex. Matches within
17
+ # your regex using () are substituted in the new path using printf-like
18
+ # syntax.
19
+ #
20
+ # Ramaze::Route[ %r!^/(\d+)\.te?xt$! ] = "/text/%d"
21
+ # '/123.txt' => '/text/123'
22
+ # '/789.text' => '/text/789'
23
+ #
24
+ # For more complex routing, lambda routers can be used. Lambda routers are
25
+ # passed in the current path and request object, and must return either a new
26
+ # path string, or nil.
27
+ #
28
+ # Ramaze::Route[ 'name of route' ] = lambda{ |path, request|
29
+ # '/bar' if path == '/foo' and request[:bar] == '1'
30
+ # }
31
+ # '/foo' => '/foo'
32
+ # '/foo?bar=1' => '/bar'
33
+ #
34
+ # Lambda routers can also use this alternative syntax:
35
+ #
36
+ # Ramaze::Route('name of route') do |path, request|
37
+ # '/bar' if path == '/foo' and request[:bar] == '1'
38
+ # end
39
+
40
+ class Route
41
+ trait[:routes] ||= Dictionary.new
42
+
43
+ class << self
44
+ # Retrieve key from trait
45
+ def [](key)
46
+ trait[:routes][key]
47
+ end
48
+
49
+ # Set key to value in trait
50
+ def []=(key, value)
51
+ trait[:routes][key] = value
52
+ end
53
+
54
+ # remove all routes
55
+ def clear
56
+ trait[:routes].clear
57
+ end
58
+
59
+ # Resolve path according to routes.
60
+ def resolve(path)
61
+ trait[:routes].each do |key, val|
62
+ if key.is_a?(Regexp)
63
+ if md = path.match(key)
64
+ return val % md.to_a[1..-1]
65
+ end
66
+
67
+ elsif val.respond_to?(:call)
68
+ if new_path = val.call(path, Request.current)
69
+ return new_path
70
+ end
71
+
72
+ elsif val.is_a?(String)
73
+ return val if path == key
74
+
75
+ else
76
+ Log.error "Invalid route #{key} => #{val}"
77
+ end
78
+ end
79
+
80
+ nil
81
+ end
82
+ end
83
+ end
84
+
85
+ class Rewrite < Route
86
+ trait[:routes] ||= Dictionary.new
87
+ end
88
+
89
+ # Shortcut for defining new routes.
90
+ def self.Route(name, value = nil, &block)
91
+ Route[name] = value || block
92
+ end
93
+
94
+ def self.Rewrite(name, value = nil, &block)
95
+ Rewrite[name] = value || block
96
+ end
97
+ end
@@ -0,0 +1,50 @@
1
+ module Ramaze
2
+ def self.setup(start = true, &block)
3
+ SetupEnvironment.new(&block) if block_given?
4
+ self.start if start
5
+ end
6
+
7
+ class SetupEnvironment
8
+ # FIXME:
9
+ # * This is weird, class scope includes Global, yet it's skipped
10
+ # by Ruby on the lookup only because it's not in the scope of the block
11
+ # at the point of creation, shouldn't instance_eval take the binding of
12
+ # the SetupEnvironment instance in acocunt?
13
+
14
+ def initialize(&block)
15
+ instance_eval(&block)
16
+ end
17
+
18
+ # Shortcut for Ramaze::Gems::gem
19
+ def gem(*args)
20
+ require 'ramaze/contrib/gems'
21
+ Ramaze::Gems::gem(*args)
22
+ Ramaze::Gems::setup
23
+ end
24
+
25
+ # Shortcut if you don't need specific versions but tons of gems
26
+ def gems(*args)
27
+ args.each{|g| gem(g) }
28
+ end
29
+
30
+ def global(hash = nil)
31
+ if hash
32
+ Global.merge!(hash)
33
+ else
34
+ Global
35
+ end
36
+ end
37
+ alias option global
38
+ end
39
+ end
40
+
41
+ __END__
42
+ Usage example:
43
+
44
+ Ramaze.setup do
45
+ gem 'json'
46
+
47
+ option :middleware => true
48
+ global.adapter = :thin
49
+ option.port = 7000
50
+ end
@@ -0,0 +1,44 @@
1
+ # Copyright (c) 2008 Michael Fellinger m.fellinger@gmail.com
2
+ # All files in this distribution are subject to the terms of the Ruby license.
3
+
4
+ module Ramaze
5
+ module CoreExtensions
6
+
7
+ # Extensions for Array
8
+
9
+ module Array
10
+
11
+ # a = [1, 2, 3]
12
+ # a.put_within(4, :after => 2, :before => 3)
13
+ # a # => [1, 2, 4, 3]
14
+
15
+ def put_within(object, constrain)
16
+ pre, post = constrain.values_at(:after, :before)
17
+
18
+ return put_after(pre, object) if rindex(post) - index(pre) == 1
19
+
20
+ raise ArgumentError, "Too many elements within constrain"
21
+ end
22
+
23
+ # a = [1, 2, 3]
24
+ # a.put_after(2, 4)
25
+ # a # => [1, 2, 4, 3]
26
+
27
+ def put_after(element, object)
28
+ return self[index(element) + 1, 0] = object if include?(element)
29
+
30
+ raise ArgumentError, "The given element doesn't exist"
31
+ end
32
+
33
+ # a = [1, 2, 3]
34
+ # a.put_before(2, 4)
35
+ # a # => [1, 4, 2, 3]
36
+
37
+ def put_before(element, object)
38
+ return self[rindex(element), 0] = object if include?(element)
39
+
40
+ raise ArgumentError, "The given element doesn't exist"
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,25 @@
1
+ module Ramaze
2
+ module CoreExtensions
3
+
4
+ # Extensions for Binding
5
+
6
+ module Binding
7
+
8
+ # Returns a hash of localvar/localvar-values from binding, useful for
9
+ # template engines that do not accept bindings and force passing locals
10
+ # via hash
11
+ #
12
+ # Usage:
13
+ # x = 42; p binding.locals #=> {'x'=> 42}
14
+
15
+ def locals
16
+ ::Kernel::eval '
17
+ local_variables.inject({}){|h,v|
18
+ k = v.to_s
19
+ h.merge!(k => eval(k))
20
+ }', self
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,7 @@
1
+ unless defined?(BlankSlate)
2
+ class BlankSlate < BasicObject; end if defined?(BasicObject)
3
+
4
+ class BlankSlate
5
+ instance_methods.each { |m| undef_method m unless m =~ /^__/ }
6
+ end
7
+ end
@@ -0,0 +1,504 @@
1
+ # = dictionary.rb
2
+ #
3
+ # == Copyright (c) 2005 Jan Molic, Thomas Sawyer
4
+ #
5
+ # Ruby License
6
+ #
7
+ # This module is free software. You may use, modify, and/or redistribute this
8
+ # software under the same terms as Ruby.
9
+ #
10
+ # This program is distributed in the hope that it will be useful, but WITHOUT
11
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12
+ # FOR A PARTICULAR PURPOSE.
13
+ #
14
+ # == Special Thanks
15
+ #
16
+ # Ported from OrderHash 2.0, Copyright (c) 2005 jan molic
17
+ #
18
+ # Thanks to Andrew Johnson for his suggestions and fixes of Hash[],
19
+ # merge, to_a, inspect and shift.
20
+ #
21
+ # == Authors & Contributors
22
+ #
23
+ # * Jan Molic
24
+ # * Thomas Sawyer
25
+
26
+ # Author:: Jan Molic
27
+ # Copyright:: Copyright (c) 2006 Jan Molic
28
+ # License:: Ruby License
29
+
30
+ # = Dictionary
31
+ #
32
+ # The Dictionary class is a Hash that preserves order.
33
+ # So it has some array-like extensions also. By defualt
34
+ # a Dictionary object preserves insertion order, but any
35
+ # order can be specified including alphabetical key order.
36
+ #
37
+ # == Usage
38
+ #
39
+ # Just require this file and use Dictionary instead of Hash.
40
+ #
41
+ # # You can do simply
42
+ # hsh = Dictionary.new
43
+ # hsh['z'] = 1
44
+ # hsh['a'] = 2
45
+ # hsh['c'] = 3
46
+ # p hsh.keys #=> ['z','a','c']
47
+ #
48
+ # # or using Dictionary[] method
49
+ # hsh = Dictionary['z', 1, 'a', 2, 'c', 3]
50
+ # p hsh.keys #=> ['z','a','c']
51
+ #
52
+ # # but this don't preserve order
53
+ # hsh = Dictionary['z'=>1, 'a'=>2, 'c'=>3]
54
+ # p hsh.keys #=> ['a','c','z']
55
+ #
56
+ # # Dictionary has useful extensions: push, pop and unshift
57
+ # p hsh.push('to_end', 15) #=> true, key added
58
+ # p hsh.push('to_end', 30) #=> false, already - nothing happen
59
+ # p hsh.unshift('to_begin', 50) #=> true, key added
60
+ # p hsh.unshift('to_begin', 60) #=> false, already - nothing happen
61
+ # p hsh.keys #=> ["to_begin", "a", "c", "z", "to_end"]
62
+ # p hsh.pop #=> ["to_end", 15], if nothing remains, return nil
63
+ # p hsh.keys #=> ["to_begin", "a", "c", "z"]
64
+ # p hsh.shift #=> ["to_begin", 30], if nothing remains, return nil
65
+ #
66
+ # == Usage Notes
67
+ #
68
+ # * You can use #order_by to set internal sort order.
69
+ # * #<< takes a two element [k,v] array and inserts.
70
+ # * Use ::auto which creates Dictionay sub-entries as needed.
71
+ # * And ::alpha which creates a new Dictionary sorted by key.
72
+
73
+ module Ramaze
74
+ class Dictionary
75
+
76
+ class << self
77
+
78
+ #--
79
+ # TODO is this needed? Doesn't the super class do this?
80
+ #++
81
+
82
+ def []( *args )
83
+ hsh = new
84
+ if Hash === args[0]
85
+ hsh.replace(args[0])
86
+ elsif (args.size % 2) != 0
87
+ raise ArgumentError, "odd number of elements for Hash"
88
+ else
89
+ while !args.empty?
90
+ hsh[args.shift] = args.shift
91
+ end
92
+ end
93
+ hsh
94
+ end
95
+
96
+ # Like #new but the block sets the order.
97
+ #
98
+ def new_by( *args, &blk )
99
+ new(*args).order_by(&blk)
100
+ end
101
+
102
+ # Alternate to #new which creates a dictionary sorted by key.
103
+ #
104
+ # d = Dictionary.alpha
105
+ # d["z"] = 1
106
+ # d["y"] = 2
107
+ # d["x"] = 3
108
+ # d #=> {"x"=>3,"y"=>2,"z"=>2}
109
+ #
110
+ # This is equivalent to:
111
+ #
112
+ # Dictionary.new.order_by { |key,value| key }
113
+
114
+ def alpha( *args, &block )
115
+ new( *args, &block ).order_by_key
116
+ end
117
+
118
+ # Alternate to #new which auto-creates sub-dictionaries as needed.
119
+ #
120
+ # d = Dictionary.auto
121
+ # d["a"]["b"]["c"] = "abc" #=> { "a"=>{"b"=>{"c"=>"abc"}}}
122
+ #
123
+ def auto( *args )
124
+ #AutoDictionary.new(*args)
125
+ leet = lambda { |hsh, key| hsh[key] = new( &leet ) }
126
+ new(*args, &leet)
127
+ end
128
+ end
129
+
130
+ def initialize( *args, &blk )
131
+ @order = []
132
+ @order_by = nil
133
+ @hash = Hash.new( *args, &blk )
134
+ end
135
+
136
+ def order
137
+ reorder if @order_by
138
+ @order
139
+ end
140
+
141
+ # Keep dictionary sorted by a specific sort order.
142
+
143
+ def order_by( &block )
144
+ @order_by = block
145
+ order
146
+ self
147
+ end
148
+
149
+ # Keep dictionary sorted by key.
150
+ #
151
+ # d = Dictionary.new.order_by_key
152
+ # d["z"] = 1
153
+ # d["y"] = 2
154
+ # d["x"] = 3
155
+ # d #=> {"x"=>3,"y"=>2,"z"=>2}
156
+ #
157
+ # This is equivalent to:
158
+ #
159
+ # Dictionary.new.order_by { |key,value| key }
160
+ #
161
+ # The initializer Dictionary#alpha also provides this.
162
+
163
+ def order_by_key
164
+ @order_by = lambda { |k,v| k }
165
+ order
166
+ self
167
+ end
168
+
169
+ # Keep dictionary sorted by value.
170
+ #
171
+ # d = Dictionary.new.order_by_value
172
+ # d["z"] = 1
173
+ # d["y"] = 2
174
+ # d["x"] = 3
175
+ # d #=> {"x"=>3,"y"=>2,"z"=>2}
176
+ #
177
+ # This is equivalent to:
178
+ #
179
+ # Dictionary.new.order_by { |key,value| value }
180
+
181
+ def order_by_value
182
+ @order_by = lambda { |k,v| v }
183
+ order
184
+ self
185
+ end
186
+
187
+ #
188
+
189
+ def reorder
190
+ if @order_by
191
+ assoc = @order.collect{ |k| [k,@hash[k]] }.sort_by( &@order_by )
192
+ @order = assoc.collect{ |k,v| k }
193
+ end
194
+ @order
195
+ end
196
+
197
+ #def ==( hsh2 )
198
+ # return false if @order != hsh2.order
199
+ # super hsh2
200
+ #end
201
+
202
+ def ==( hsh2 )
203
+ if hsh2.is_a?( Dictionary )
204
+ @order == hsh2.order &&
205
+ @hash == hsh2.instance_variable_get("@hash")
206
+ else
207
+ false
208
+ end
209
+ end
210
+
211
+ def [] k
212
+ @hash[ k ]
213
+ end
214
+
215
+ def fetch( k )
216
+ @hash.fetch( k )
217
+ end
218
+
219
+ # Store operator.
220
+ #
221
+ # h[key] = value
222
+ #
223
+ # Or with additional index.
224
+ #
225
+ # h[key,index] = value
226
+
227
+ def []=(k, i=nil, v=nil)
228
+ if v
229
+ insert(i,k,v)
230
+ else
231
+ store(k,i)
232
+ end
233
+ end
234
+
235
+ def insert( i,k,v )
236
+ @order.insert( i,k )
237
+ @hash.store( k,v )
238
+ end
239
+
240
+ def store( a,b )
241
+ @order.push( a ) unless @hash.has_key?( a )
242
+ @hash.store( a,b )
243
+ end
244
+
245
+ def clear
246
+ @order = []
247
+ @hash.clear
248
+ end
249
+
250
+ def delete( key )
251
+ @order.delete( key )
252
+ @hash.delete( key )
253
+ end
254
+
255
+ def each_key
256
+ order.each { |k| yield( k ) }
257
+ self
258
+ end
259
+
260
+ def each_value
261
+ order.each { |k| yield( @hash[k] ) }
262
+ self
263
+ end
264
+
265
+ def each
266
+ order.each { |k| yield( k,@hash[k] ) }
267
+ self
268
+ end
269
+ alias each_pair each
270
+
271
+ def delete_if
272
+ order.clone.each { |k| delete k if yield }
273
+ self
274
+ end
275
+
276
+ def values
277
+ ary = []
278
+ order.each { |k| ary.push @hash[k] }
279
+ ary
280
+ end
281
+
282
+ def keys
283
+ order
284
+ end
285
+
286
+ def invert
287
+ hsh2 = self.class.new
288
+ order.each { |k| hsh2[@hash[k]] = k }
289
+ hsh2
290
+ end
291
+
292
+ def reject( &block )
293
+ self.dup.delete_if(&block)
294
+ end
295
+
296
+ def reject!( &block )
297
+ hsh2 = reject(&block)
298
+ self == hsh2 ? nil : hsh2
299
+ end
300
+
301
+ def replace( hsh2 )
302
+ @order = hsh2.order
303
+ @hash = hsh2.hash
304
+ end
305
+
306
+ def shift
307
+ key = order.first
308
+ key ? [key,delete(key)] : super
309
+ end
310
+
311
+ def unshift( k,v )
312
+ unless @hash.include?( k )
313
+ @order.unshift( k )
314
+ @hash.store( k,v )
315
+ true
316
+ else
317
+ false
318
+ end
319
+ end
320
+
321
+ def <<(kv)
322
+ push(*kv)
323
+ end
324
+
325
+ def push( k,v )
326
+ unless @hash.include?( k )
327
+ @order.push( k )
328
+ @hash.store( k,v )
329
+ true
330
+ else
331
+ false
332
+ end
333
+ end
334
+
335
+ def pop
336
+ key = order.last
337
+ key ? [key,delete(key)] : nil
338
+ end
339
+
340
+ def to_a
341
+ ary = []
342
+ each { |k,v| ary << [k,v] }
343
+ ary
344
+ end
345
+
346
+ def to_s
347
+ self.to_a.to_s
348
+ end
349
+
350
+ def inspect
351
+ ary = []
352
+ each {|k,v| ary << k.inspect + "=>" + v.inspect}
353
+ '{' + ary.join(", ") + '}'
354
+ end
355
+
356
+ def dup
357
+ self.class[*to_a.flatten]
358
+ end
359
+
360
+ def update( hsh2 )
361
+ hsh2.each { |k,v| self[k] = v }
362
+ reorder
363
+ self
364
+ end
365
+ alias merge! update
366
+
367
+ def merge( hsh2 )
368
+ self.dup.update(hsh2)
369
+ end
370
+
371
+ def select
372
+ ary = []
373
+ each { |k,v| ary << [k,v] if yield k,v }
374
+ ary
375
+ end
376
+
377
+ def find
378
+ each{|k,v| return k, v if yield(k,v) }
379
+ return nil
380
+ end
381
+
382
+ def first
383
+ @hash[order.first]
384
+ end
385
+
386
+ def last
387
+ @hash[order.last]
388
+ end
389
+
390
+ def length
391
+ @order.length
392
+ end
393
+ alias size length
394
+
395
+ def empty?
396
+ @hash.empty?
397
+ end
398
+
399
+ end
400
+ end
401
+
402
+
403
+
404
+ # _____ _
405
+ # |_ _|__ ___| |_
406
+ # | |/ _ \/ __| __|
407
+ # | | __/\__ \ |_
408
+ # |_|\___||___/\__|
409
+ #
410
+
411
+ =begin testing
412
+
413
+ require 'test/unit'
414
+
415
+ class TC_Dictionary < Test::Unit::TestCase
416
+
417
+ def test_create
418
+ hsh = Dictionary['z', 1, 'a', 2, 'c', 3]
419
+ assert_equal( ['z','a','c'], hsh.keys )
420
+ end
421
+
422
+ def test_op_store
423
+ hsh = Dictionary.new
424
+ hsh['z'] = 1
425
+ hsh['a'] = 2
426
+ hsh['c'] = 3
427
+ assert_equal( ['z','a','c'], hsh.keys )
428
+ end
429
+
430
+ def test_push
431
+ hsh = Dictionary['a', 1, 'c', 2, 'z', 3]
432
+ assert( hsh.push('end', 15) )
433
+ assert_equal( 15, hsh['end'] )
434
+ assert( ! hsh.push('end', 30) )
435
+ assert( hsh.unshift('begin', 50) )
436
+ assert_equal( 50, hsh['begin'] )
437
+ assert( ! hsh.unshift('begin', 60) )
438
+ assert_equal( ["begin", "a", "c", "z", "end"], hsh.keys )
439
+ assert_equal( ["end", 15], hsh.pop )
440
+ assert_equal( ["begin", "a", "c", "z"], hsh.keys )
441
+ assert_equal( ["begin", 50], hsh.shift )
442
+ end
443
+
444
+ def test_insert
445
+ # front
446
+ h = Dictionary['a', 1, 'b', 2, 'c', 3]
447
+ r = Dictionary['d', 4, 'a', 1, 'b', 2, 'c', 3]
448
+ assert_equal( 4, h.insert(0,'d',4) )
449
+ assert_equal( r, h )
450
+ # back
451
+ h = Dictionary['a', 1, 'b', 2, 'c', 3]
452
+ r = Dictionary['a', 1, 'b', 2, 'c', 3, 'd', 4]
453
+ assert_equal( 4, h.insert(-1,'d',4) )
454
+ assert_equal( r, h )
455
+ end
456
+
457
+ def test_update
458
+ # with other orderred hash
459
+ h1 = Dictionary['a', 1, 'b', 2, 'c', 3]
460
+ h2 = Dictionary['d', 4]
461
+ r = Dictionary['a', 1, 'b', 2, 'c', 3, 'd', 4]
462
+ assert_equal( r, h1.update(h2) )
463
+ assert_equal( r, h1 )
464
+ # with other hash
465
+ h1 = Dictionary['a', 1, 'b', 2, 'c', 3]
466
+ h2 = { 'd' => 4 }
467
+ r = Dictionary['a', 1, 'b', 2, 'c', 3, 'd', 4]
468
+ assert_equal( r, h1.update(h2) )
469
+ assert_equal( r, h1 )
470
+ end
471
+
472
+ def test_merge
473
+ # with other orderred hash
474
+ h1 = Dictionary['a', 1, 'b', 2, 'c', 3]
475
+ h2 = Dictionary['d', 4]
476
+ r = Dictionary['a', 1, 'b', 2, 'c', 3, 'd', 4]
477
+ assert_equal( r, h1.merge(h2) )
478
+ # with other hash
479
+ h1 = Dictionary['a', 1, 'b', 2, 'c', 3]
480
+ h2 = { 'd' => 4 }
481
+ r = Dictionary['a', 1, 'b', 2, 'c', 3, 'd', 4]
482
+ assert_equal( r, h1.merge(h2) )
483
+ end
484
+
485
+ def test_order_by
486
+ h1 = Dictionary['a', 3, 'b', 2, 'c', 1]
487
+ h1.order_by{ |k,v| v }
488
+ assert_equal( [1,2,3], h1.values )
489
+ assert_equal( ['c','b','a'], h1.keys )
490
+ end
491
+
492
+ def test_op_store
493
+ h1 = Dictionary[]
494
+ h1[:a] = 1
495
+ h1[:c] = 3
496
+ assert_equal( [1,3], h1.values )
497
+ h1[:b,1] = 2
498
+ assert_equal( [1,2,3], h1.values )
499
+ assert_equal( [:a,:b,:c], h1.keys )
500
+ end
501
+
502
+ end
503
+
504
+ =end