Pistos-ramaze 2008.09

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (588) hide show
  1. data/README.markdown +481 -0
  2. data/Rakefile +228 -0
  3. data/benchmark/results.txt +131 -0
  4. data/benchmark/run.rb +362 -0
  5. data/benchmark/suite/minimal.rb +13 -0
  6. data/benchmark/suite/no_informer.rb +9 -0
  7. data/benchmark/suite/no_sessions.rb +10 -0
  8. data/benchmark/suite/no_template.rb +9 -0
  9. data/benchmark/suite/simple.rb +7 -0
  10. data/benchmark/suite/template_amrita2.rb +17 -0
  11. data/benchmark/suite/template_builder.rb +12 -0
  12. data/benchmark/suite/template_erubis.rb +10 -0
  13. data/benchmark/suite/template_ezamar.rb +10 -0
  14. data/benchmark/suite/template_haml.rb +15 -0
  15. data/benchmark/suite/template_liquid.rb +13 -0
  16. data/benchmark/suite/template_markaby.rb +11 -0
  17. data/benchmark/suite/template_nagoro.rb +10 -0
  18. data/benchmark/suite/template_redcloth.rb +15 -0
  19. data/benchmark/suite/template_tenjin.rb +10 -0
  20. data/benchmark/test.rb +35 -0
  21. data/bin/ramaze +80 -0
  22. data/doc/AUTHORS +29 -0
  23. data/doc/CHANGELOG +19530 -0
  24. data/doc/COPYING +56 -0
  25. data/doc/FAQ +92 -0
  26. data/doc/GPL +339 -0
  27. data/doc/INSTALL +92 -0
  28. data/doc/LEGAL +26 -0
  29. data/doc/TODO +29 -0
  30. data/doc/meta/announcement.txt +99 -0
  31. data/doc/meta/configuration.txt +163 -0
  32. data/doc/meta/internals.txt +278 -0
  33. data/doc/meta/users.kml +64 -0
  34. data/doc/readme_chunks/appendix.txt +10 -0
  35. data/doc/readme_chunks/examples.txt +38 -0
  36. data/doc/readme_chunks/features.txt +148 -0
  37. data/doc/readme_chunks/getting_help.txt +5 -0
  38. data/doc/readme_chunks/getting_started.txt +18 -0
  39. data/doc/readme_chunks/installing.txt +92 -0
  40. data/doc/readme_chunks/introduction.txt +18 -0
  41. data/doc/readme_chunks/principles.txt +56 -0
  42. data/doc/readme_chunks/thanks.txt +59 -0
  43. data/doc/tutorial/todolist.html +742 -0
  44. data/doc/tutorial/todolist.mkd +787 -0
  45. data/examples/app/auth/auth.rb +54 -0
  46. data/examples/app/auth/template/layout.haml +20 -0
  47. data/examples/app/auth/template/login.haml +16 -0
  48. data/examples/app/blog/README +3 -0
  49. data/examples/app/blog/controller/main.rb +29 -0
  50. data/examples/app/blog/model/entry.rb +30 -0
  51. data/examples/app/blog/public/styles/blog.css +132 -0
  52. data/examples/app/blog/spec/blog.rb +87 -0
  53. data/examples/app/blog/start.rb +7 -0
  54. data/examples/app/blog/view/edit.xhtml +17 -0
  55. data/examples/app/blog/view/index.xhtml +17 -0
  56. data/examples/app/blog/view/layout.xhtml +11 -0
  57. data/examples/app/blog/view/new.xhtml +16 -0
  58. data/examples/app/chat/model/history.rb +36 -0
  59. data/examples/app/chat/model/message.rb +7 -0
  60. data/examples/app/chat/public/css/chat.css +13 -0
  61. data/examples/app/chat/public/js/chat.js +22 -0
  62. data/examples/app/chat/public/js/jquery.js +3436 -0
  63. data/examples/app/chat/start.rb +40 -0
  64. data/examples/app/chat/view/chat.xhtml +9 -0
  65. data/examples/app/chat/view/index.xhtml +7 -0
  66. data/examples/app/chat/view/layout.xhtml +13 -0
  67. data/examples/app/localization/start.rb +35 -0
  68. data/examples/app/rapaste/Rakefile +34 -0
  69. data/examples/app/rapaste/controller/paste.rb +101 -0
  70. data/examples/app/rapaste/model/paste.rb +58 -0
  71. data/examples/app/rapaste/public/css/active4d.css +114 -0
  72. data/examples/app/rapaste/public/css/all_hallows_eve.css +72 -0
  73. data/examples/app/rapaste/public/css/amy.css +147 -0
  74. data/examples/app/rapaste/public/css/blackboard.css +88 -0
  75. data/examples/app/rapaste/public/css/brilliance_black.css +605 -0
  76. data/examples/app/rapaste/public/css/brilliance_dull.css +599 -0
  77. data/examples/app/rapaste/public/css/cobalt.css +149 -0
  78. data/examples/app/rapaste/public/css/dawn.css +121 -0
  79. data/examples/app/rapaste/public/css/display.css +197 -0
  80. data/examples/app/rapaste/public/css/eiffel.css +121 -0
  81. data/examples/app/rapaste/public/css/espresso_libre.css +109 -0
  82. data/examples/app/rapaste/public/css/idle.css +62 -0
  83. data/examples/app/rapaste/public/css/iplastic.css +80 -0
  84. data/examples/app/rapaste/public/css/lazy.css +73 -0
  85. data/examples/app/rapaste/public/css/mac_classic.css +123 -0
  86. data/examples/app/rapaste/public/css/magicwb_amiga.css +104 -0
  87. data/examples/app/rapaste/public/css/pastels_on_dark.css +188 -0
  88. data/examples/app/rapaste/public/css/slush_poppies.css +85 -0
  89. data/examples/app/rapaste/public/css/spacecadet.css +51 -0
  90. data/examples/app/rapaste/public/css/sunburst.css +180 -0
  91. data/examples/app/rapaste/public/css/twilight.css +137 -0
  92. data/examples/app/rapaste/public/css/zenburnesque.css +91 -0
  93. data/examples/app/rapaste/public/js/jquery.js +11 -0
  94. data/examples/app/rapaste/spec/rapaste.rb +51 -0
  95. data/examples/app/rapaste/start.rb +25 -0
  96. data/examples/app/rapaste/view/copy.xhtml +10 -0
  97. data/examples/app/rapaste/view/index.xhtml +9 -0
  98. data/examples/app/rapaste/view/layout.xhtml +25 -0
  99. data/examples/app/rapaste/view/list.xhtml +29 -0
  100. data/examples/app/rapaste/view/search.xhtml +41 -0
  101. data/examples/app/rapaste/view/view.xhtml +37 -0
  102. data/examples/app/sourceview/public/coderay.css +104 -0
  103. data/examples/app/sourceview/public/images/file.gif +0 -0
  104. data/examples/app/sourceview/public/images/folder.gif +0 -0
  105. data/examples/app/sourceview/public/images/tv-collapsable-last.gif +0 -0
  106. data/examples/app/sourceview/public/images/tv-collapsable.gif +0 -0
  107. data/examples/app/sourceview/public/images/tv-expandable-last.gif +0 -0
  108. data/examples/app/sourceview/public/images/tv-expandable.gif +0 -0
  109. data/examples/app/sourceview/public/images/tv-item-last.gif +0 -0
  110. data/examples/app/sourceview/public/images/tv-item.gif +0 -0
  111. data/examples/app/sourceview/public/jquery.js +11 -0
  112. data/examples/app/sourceview/public/jquery.treeview.css +48 -0
  113. data/examples/app/sourceview/public/jquery.treeview.js +223 -0
  114. data/examples/app/sourceview/public/sourceview.js +52 -0
  115. data/examples/app/sourceview/sourceview.rb +77 -0
  116. data/examples/app/sourceview/template/index.haml +59 -0
  117. data/examples/app/todolist/README +1 -0
  118. data/examples/app/todolist/public/favicon.ico +0 -0
  119. data/examples/app/todolist/public/js/jquery.js +1923 -0
  120. data/examples/app/todolist/public/ramaze.png +0 -0
  121. data/examples/app/todolist/spec/todolist.rb +132 -0
  122. data/examples/app/todolist/src/controller/main.rb +70 -0
  123. data/examples/app/todolist/src/element/page.rb +31 -0
  124. data/examples/app/todolist/src/model.rb +14 -0
  125. data/examples/app/todolist/start.rb +11 -0
  126. data/examples/app/todolist/template/index.xhtml +17 -0
  127. data/examples/app/todolist/template/new.xhtml +7 -0
  128. data/examples/app/upload/start.rb +19 -0
  129. data/examples/app/upload/view/index.xhtml +25 -0
  130. data/examples/app/whywiki/spec/whywiki.rb +58 -0
  131. data/examples/app/whywiki/start.rb +46 -0
  132. data/examples/app/whywiki/template/edit.xhtml +14 -0
  133. data/examples/app/whywiki/template/show.xhtml +18 -0
  134. data/examples/app/wikore/spec/wikore.rb +111 -0
  135. data/examples/app/wikore/src/controller.rb +80 -0
  136. data/examples/app/wikore/src/model.rb +53 -0
  137. data/examples/app/wikore/start.rb +9 -0
  138. data/examples/app/wikore/template/index.xhtml +8 -0
  139. data/examples/app/wiktacular/README +2 -0
  140. data/examples/app/wiktacular/mkd/link/2007-07-20_19-45-51.mkd +1 -0
  141. data/examples/app/wiktacular/mkd/link/current.mkd +1 -0
  142. data/examples/app/wiktacular/mkd/main/2007-07-20_16-31-33.mkd +1 -0
  143. data/examples/app/wiktacular/mkd/main/2007-07-20_19-21-12.mkd +1 -0
  144. data/examples/app/wiktacular/mkd/main/2007-07-20_19-23-10.mkd +2 -0
  145. data/examples/app/wiktacular/mkd/main/2007-07-20_19-45-07.mkd +2 -0
  146. data/examples/app/wiktacular/mkd/main/current.mkd +2 -0
  147. data/examples/app/wiktacular/mkd/markdown/current.mkd +3 -0
  148. data/examples/app/wiktacular/mkd/testing/2007-07-20_16-43-46.mkd +2 -0
  149. data/examples/app/wiktacular/mkd/testing/2007-07-20_19-43-50.mkd +3 -0
  150. data/examples/app/wiktacular/mkd/testing/2007-07-21_18-46-01.mkd +11 -0
  151. data/examples/app/wiktacular/mkd/testing/2007-07-21_18-46-32.mkd +13 -0
  152. data/examples/app/wiktacular/mkd/testing/2007-07-21_18-47-08.mkd +17 -0
  153. data/examples/app/wiktacular/mkd/testing/2007-07-21_18-47-54.mkd +17 -0
  154. data/examples/app/wiktacular/mkd/testing/current.mkd +17 -0
  155. data/examples/app/wiktacular/public/favicon.ico +0 -0
  156. data/examples/app/wiktacular/public/screen.css +72 -0
  157. data/examples/app/wiktacular/spec/wiktacular.rb +157 -0
  158. data/examples/app/wiktacular/src/controller.rb +55 -0
  159. data/examples/app/wiktacular/src/model.rb +102 -0
  160. data/examples/app/wiktacular/start.rb +8 -0
  161. data/examples/app/wiktacular/template/edit.xhtml +6 -0
  162. data/examples/app/wiktacular/template/html_layout.xhtml +27 -0
  163. data/examples/app/wiktacular/template/index.xhtml +9 -0
  164. data/examples/app/wiktacular/template/new.xhtml +6 -0
  165. data/examples/basic/element.rb +45 -0
  166. data/examples/basic/gestalt.rb +27 -0
  167. data/examples/basic/hello.rb +15 -0
  168. data/examples/basic/layout.rb +28 -0
  169. data/examples/basic/linking.rb +29 -0
  170. data/examples/basic/simple.rb +56 -0
  171. data/examples/helpers/cache.rb +31 -0
  172. data/examples/helpers/form_with_sequel.rb +24 -0
  173. data/examples/helpers/httpdigest.rb +50 -0
  174. data/examples/helpers/identity.rb +18 -0
  175. data/examples/helpers/nitro_form.rb +23 -0
  176. data/examples/helpers/paginate.rb +71 -0
  177. data/examples/helpers/provide.rb +23 -0
  178. data/examples/helpers/rest.rb +28 -0
  179. data/examples/helpers/simple_captcha.rb +29 -0
  180. data/examples/misc/css.rb +37 -0
  181. data/examples/misc/facebook.rb +159 -0
  182. data/examples/misc/memleak_detector.rb +32 -0
  183. data/examples/misc/nagoro_element.rb +43 -0
  184. data/examples/misc/ramaise.rb +132 -0
  185. data/examples/misc/rapp.rb +45 -0
  186. data/examples/misc/sequel_scaffolding.rb +34 -0
  187. data/examples/misc/simple_auth.rb +35 -0
  188. data/examples/templates/template/external.amrita +19 -0
  189. data/examples/templates/template/external.haml +22 -0
  190. data/examples/templates/template/external.liquid +28 -0
  191. data/examples/templates/template/external.mab +30 -0
  192. data/examples/templates/template/external.nag +28 -0
  193. data/examples/templates/template/external.redcloth +19 -0
  194. data/examples/templates/template/external.rem +30 -0
  195. data/examples/templates/template/external.rhtml +28 -0
  196. data/examples/templates/template/external.tenjin +28 -0
  197. data/examples/templates/template/external.xsl +57 -0
  198. data/examples/templates/template/external.zmr +28 -0
  199. data/examples/templates/template_amrita2.rb +74 -0
  200. data/examples/templates/template_erubis.rb +53 -0
  201. data/examples/templates/template_ezamar.rb +50 -0
  202. data/examples/templates/template_haml.rb +50 -0
  203. data/examples/templates/template_liquid.rb +65 -0
  204. data/examples/templates/template_markaby.rb +58 -0
  205. data/examples/templates/template_nagoro.rb +51 -0
  206. data/examples/templates/template_redcloth.rb +59 -0
  207. data/examples/templates/template_remarkably.rb +55 -0
  208. data/examples/templates/template_tenjin.rb +53 -0
  209. data/examples/templates/template_xslt.rb +49 -0
  210. data/lib/proto/controller/init.rb +10 -0
  211. data/lib/proto/controller/main.rb +20 -0
  212. data/lib/proto/model/init.rb +4 -0
  213. data/lib/proto/public/css/ramaze_error.css +90 -0
  214. data/lib/proto/public/dispatch.fcgi +11 -0
  215. data/lib/proto/public/favicon.ico +0 -0
  216. data/lib/proto/public/js/jquery.js +3549 -0
  217. data/lib/proto/public/ramaze.png +0 -0
  218. data/lib/proto/spec/main.rb +25 -0
  219. data/lib/proto/start.rb +8 -0
  220. data/lib/proto/start.ru +16 -0
  221. data/lib/proto/view/error.xhtml +64 -0
  222. data/lib/proto/view/index.xhtml +34 -0
  223. data/lib/proto/view/page.xhtml +27 -0
  224. data/lib/ramaze/action/render.rb +191 -0
  225. data/lib/ramaze/action.rb +153 -0
  226. data/lib/ramaze/adapter/base.rb +128 -0
  227. data/lib/ramaze/adapter/cgi.rb +20 -0
  228. data/lib/ramaze/adapter/ebb.rb +18 -0
  229. data/lib/ramaze/adapter/evented_mongrel.rb +7 -0
  230. data/lib/ramaze/adapter/fake.rb +12 -0
  231. data/lib/ramaze/adapter/fcgi.rb +18 -0
  232. data/lib/ramaze/adapter/lsws.rb +19 -0
  233. data/lib/ramaze/adapter/mongrel.rb +21 -0
  234. data/lib/ramaze/adapter/scgi.rb +18 -0
  235. data/lib/ramaze/adapter/swiftiplied_mongrel.rb +7 -0
  236. data/lib/ramaze/adapter/thin.rb +17 -0
  237. data/lib/ramaze/adapter/webrick.rb +43 -0
  238. data/lib/ramaze/adapter.rb +97 -0
  239. data/lib/ramaze/cache/memcached.rb +69 -0
  240. data/lib/ramaze/cache/memory.rb +6 -0
  241. data/lib/ramaze/cache/yaml_store.rb +68 -0
  242. data/lib/ramaze/cache.rb +113 -0
  243. data/lib/ramaze/contrib/auto_params/get_args.rb +58 -0
  244. data/lib/ramaze/contrib/auto_params.rb +135 -0
  245. data/lib/ramaze/contrib/email.rb +84 -0
  246. data/lib/ramaze/contrib/facebook/facebook.rb +171 -0
  247. data/lib/ramaze/contrib/facebook.rb +23 -0
  248. data/lib/ramaze/contrib/file_cache.rb +65 -0
  249. data/lib/ramaze/contrib/gems.rb +78 -0
  250. data/lib/ramaze/contrib/gettext/mo.rb +155 -0
  251. data/lib/ramaze/contrib/gettext/parser.rb +46 -0
  252. data/lib/ramaze/contrib/gettext/po.rb +109 -0
  253. data/lib/ramaze/contrib/gettext.rb +113 -0
  254. data/lib/ramaze/contrib/gzip_filter.rb +69 -0
  255. data/lib/ramaze/contrib/maruku_uv.rb +59 -0
  256. data/lib/ramaze/contrib/profiling.rb +36 -0
  257. data/lib/ramaze/contrib/rest.rb +17 -0
  258. data/lib/ramaze/contrib/sequel/create_join.rb +25 -0
  259. data/lib/ramaze/contrib/sequel/fill.rb +12 -0
  260. data/lib/ramaze/contrib/sequel/form_field.rb +129 -0
  261. data/lib/ramaze/contrib/sequel/image.rb +198 -0
  262. data/lib/ramaze/contrib/sequel/relation.rb +82 -0
  263. data/lib/ramaze/contrib/sequel_cache.rb +92 -0
  264. data/lib/ramaze/contrib.rb +82 -0
  265. data/lib/ramaze/controller/error.rb +46 -0
  266. data/lib/ramaze/controller/main.rb +2 -0
  267. data/lib/ramaze/controller/resolve.rb +273 -0
  268. data/lib/ramaze/controller.rb +280 -0
  269. data/lib/ramaze/current/request.rb +205 -0
  270. data/lib/ramaze/current/response.rb +39 -0
  271. data/lib/ramaze/current/session/flash.rb +87 -0
  272. data/lib/ramaze/current/session/hash.rb +66 -0
  273. data/lib/ramaze/current/session.rb +181 -0
  274. data/lib/ramaze/current.rb +110 -0
  275. data/lib/ramaze/dispatcher/action.rb +48 -0
  276. data/lib/ramaze/dispatcher/directory.rb +119 -0
  277. data/lib/ramaze/dispatcher/error.rb +108 -0
  278. data/lib/ramaze/dispatcher/file.rb +95 -0
  279. data/lib/ramaze/dispatcher.rb +145 -0
  280. data/lib/ramaze/error.rb +24 -0
  281. data/lib/ramaze/gestalt.rb +124 -0
  282. data/lib/ramaze/helper/aspect.rb +106 -0
  283. data/lib/ramaze/helper/auth.rb +125 -0
  284. data/lib/ramaze/helper/cache.rb +140 -0
  285. data/lib/ramaze/helper/cgi.rb +39 -0
  286. data/lib/ramaze/helper/flash.rb +59 -0
  287. data/lib/ramaze/helper/form.rb +281 -0
  288. data/lib/ramaze/helper/formatting.rb +158 -0
  289. data/lib/ramaze/helper/gestalt.rb +15 -0
  290. data/lib/ramaze/helper/gravatar.rb +15 -0
  291. data/lib/ramaze/helper/httpdigest.rb +59 -0
  292. data/lib/ramaze/helper/identity.rb +119 -0
  293. data/lib/ramaze/helper/link.rb +122 -0
  294. data/lib/ramaze/helper/markaby.rb +31 -0
  295. data/lib/ramaze/helper/maruku.rb +7 -0
  296. data/lib/ramaze/helper/nitroform.rb +14 -0
  297. data/lib/ramaze/helper/pager.rb +366 -0
  298. data/lib/ramaze/helper/paginate.rb +234 -0
  299. data/lib/ramaze/helper/partial.rb +105 -0
  300. data/lib/ramaze/helper/redirect.rb +82 -0
  301. data/lib/ramaze/helper/rest.rb +43 -0
  302. data/lib/ramaze/helper/sendfile.rb +16 -0
  303. data/lib/ramaze/helper/sequel.rb +55 -0
  304. data/lib/ramaze/helper/simple_captcha.rb +31 -0
  305. data/lib/ramaze/helper/stack.rb +77 -0
  306. data/lib/ramaze/helper/tagz.rb +19 -0
  307. data/lib/ramaze/helper/thread.rb +17 -0
  308. data/lib/ramaze/helper/ultraviolet.rb +44 -0
  309. data/lib/ramaze/helper/user.rb +110 -0
  310. data/lib/ramaze/helper/xhtml.rb +23 -0
  311. data/lib/ramaze/helper.rb +79 -0
  312. data/lib/ramaze/log/analogger.rb +40 -0
  313. data/lib/ramaze/log/growl.rb +38 -0
  314. data/lib/ramaze/log/hub.rb +41 -0
  315. data/lib/ramaze/log/informer.rb +128 -0
  316. data/lib/ramaze/log/knotify.rb +28 -0
  317. data/lib/ramaze/log/logger.rb +26 -0
  318. data/lib/ramaze/log/logging.rb +89 -0
  319. data/lib/ramaze/log/syslog.rb +51 -0
  320. data/lib/ramaze/log/xosd.rb +92 -0
  321. data/lib/ramaze/log.rb +27 -0
  322. data/lib/ramaze/option/dsl.rb +45 -0
  323. data/lib/ramaze/option/holder.rb +131 -0
  324. data/lib/ramaze/option/merger.rb +108 -0
  325. data/lib/ramaze/option.rb +156 -0
  326. data/lib/ramaze/reloader.rb +186 -0
  327. data/lib/ramaze/route.rb +97 -0
  328. data/lib/ramaze/setup.rb +50 -0
  329. data/lib/ramaze/snippets/array/put_within.rb +44 -0
  330. data/lib/ramaze/snippets/binding/locals.rb +25 -0
  331. data/lib/ramaze/snippets/blankslate.rb +7 -0
  332. data/lib/ramaze/snippets/dictionary.rb +504 -0
  333. data/lib/ramaze/snippets/divide.rb +20 -0
  334. data/lib/ramaze/snippets/fiber.rb +63 -0
  335. data/lib/ramaze/snippets/kernel/constant.rb +41 -0
  336. data/lib/ramaze/snippets/kernel/pretty_inspect.rb +21 -0
  337. data/lib/ramaze/snippets/metaid.rb +17 -0
  338. data/lib/ramaze/snippets/numeric/filesize_format.rb +32 -0
  339. data/lib/ramaze/snippets/numeric/time.rb +63 -0
  340. data/lib/ramaze/snippets/object/__dir__.rb +29 -0
  341. data/lib/ramaze/snippets/object/acquire.rb +40 -0
  342. data/lib/ramaze/snippets/object/instance_variable_defined.rb +19 -0
  343. data/lib/ramaze/snippets/object/pretty.rb +16 -0
  344. data/lib/ramaze/snippets/object/scope.rb +18 -0
  345. data/lib/ramaze/snippets/object/traits.rb +76 -0
  346. data/lib/ramaze/snippets/ordered_set.rb +51 -0
  347. data/lib/ramaze/snippets/proc/locals.rb +19 -0
  348. data/lib/ramaze/snippets/ramaze/caller_info.rb +30 -0
  349. data/lib/ramaze/snippets/ramaze/caller_lines.rb +51 -0
  350. data/lib/ramaze/snippets/ramaze/deprecated.rb +20 -0
  351. data/lib/ramaze/snippets/ramaze/fiber.rb +24 -0
  352. data/lib/ramaze/snippets/ramaze/state.rb +86 -0
  353. data/lib/ramaze/snippets/ramaze/struct.rb +45 -0
  354. data/lib/ramaze/snippets/string/camel_case.rb +21 -0
  355. data/lib/ramaze/snippets/string/color.rb +31 -0
  356. data/lib/ramaze/snippets/string/each.rb +19 -0
  357. data/lib/ramaze/snippets/string/end_with.rb +20 -0
  358. data/lib/ramaze/snippets/string/esc.rb +34 -0
  359. data/lib/ramaze/snippets/string/ord.rb +21 -0
  360. data/lib/ramaze/snippets/string/snake_case.rb +21 -0
  361. data/lib/ramaze/snippets/string/start_with.rb +19 -0
  362. data/lib/ramaze/snippets/string/unindent.rb +28 -0
  363. data/lib/ramaze/snippets/thread/into.rb +18 -0
  364. data/lib/ramaze/snippets.rb +22 -0
  365. data/lib/ramaze/spec/helper/bacon.rb +7 -0
  366. data/lib/ramaze/spec/helper/browser.rb +88 -0
  367. data/lib/ramaze/spec/helper/mock_http.rb +63 -0
  368. data/lib/ramaze/spec/helper/pretty_output.rb +82 -0
  369. data/lib/ramaze/spec/helper/requester.rb +63 -0
  370. data/lib/ramaze/spec/helper/simple_http.rb +434 -0
  371. data/lib/ramaze/spec/helper/snippets.rb +14 -0
  372. data/lib/ramaze/spec/helper.rb +135 -0
  373. data/lib/ramaze/spec.rb +1 -0
  374. data/lib/ramaze/store/default.rb +109 -0
  375. data/lib/ramaze/template/amrita2.rb +45 -0
  376. data/lib/ramaze/template/builder.rb +28 -0
  377. data/lib/ramaze/template/erubis.rb +41 -0
  378. data/lib/ramaze/template/ezamar/element.rb +169 -0
  379. data/lib/ramaze/template/ezamar/engine.rb +76 -0
  380. data/lib/ramaze/template/ezamar/morpher.rb +135 -0
  381. data/lib/ramaze/template/ezamar/render_partial.rb +31 -0
  382. data/lib/ramaze/template/ezamar/textpow.syntax +34 -0
  383. data/lib/ramaze/template/ezamar.rb +42 -0
  384. data/lib/ramaze/template/haml.rb +37 -0
  385. data/lib/ramaze/template/liquid.rb +36 -0
  386. data/lib/ramaze/template/markaby.rb +52 -0
  387. data/lib/ramaze/template/maruku.rb +34 -0
  388. data/lib/ramaze/template/nagoro.rb +52 -0
  389. data/lib/ramaze/template/none.rb +14 -0
  390. data/lib/ramaze/template/redcloth.rb +25 -0
  391. data/lib/ramaze/template/remarkably.rb +38 -0
  392. data/lib/ramaze/template/sass.rb +37 -0
  393. data/lib/ramaze/template/tagz.rb +79 -0
  394. data/lib/ramaze/template/tenjin.rb +74 -0
  395. data/lib/ramaze/template/xslt.rb +100 -0
  396. data/lib/ramaze/template.rb +87 -0
  397. data/lib/ramaze/tool/create.rb +48 -0
  398. data/lib/ramaze/tool/daemonize.rb +37 -0
  399. data/lib/ramaze/tool/localize.rb +202 -0
  400. data/lib/ramaze/tool/mime.rb +35 -0
  401. data/lib/ramaze/tool/mime_types.yaml +615 -0
  402. data/lib/ramaze/tool/project_creator.rb +110 -0
  403. data/lib/ramaze/tool/record.rb +6 -0
  404. data/lib/ramaze/tool.rb +9 -0
  405. data/lib/ramaze/trinity.rb +16 -0
  406. data/lib/ramaze/version.rb +6 -0
  407. data/lib/ramaze.rb +133 -0
  408. data/lib/vendor/bacon.rb +323 -0
  409. data/rake_tasks/conf.rake +71 -0
  410. data/rake_tasks/coverage.rake +46 -0
  411. data/rake_tasks/gem.rake +74 -0
  412. data/rake_tasks/git.rake +41 -0
  413. data/rake_tasks/maintenance.rake +386 -0
  414. data/rake_tasks/metric.rake +24 -0
  415. data/rake_tasks/release.rake +76 -0
  416. data/rake_tasks/spec.rake +61 -0
  417. data/ramaze.gemspec +773 -0
  418. data/spec/contrib/auto_params.rb +121 -0
  419. data/spec/contrib/profiling.rb +29 -0
  420. data/spec/contrib/sequel/fill.rb +47 -0
  421. data/spec/examples/caching.rb +19 -0
  422. data/spec/examples/css.rb +15 -0
  423. data/spec/examples/element.rb +15 -0
  424. data/spec/examples/hello.rb +11 -0
  425. data/spec/examples/linking.rb +18 -0
  426. data/spec/examples/simple.rb +45 -0
  427. data/spec/examples/simple_auth.rb +32 -0
  428. data/spec/examples/templates/template_amrita2.rb +16 -0
  429. data/spec/examples/templates/template_erubis.rb +23 -0
  430. data/spec/examples/templates/template_ezamar.rb +23 -0
  431. data/spec/examples/templates/template_haml.rb +23 -0
  432. data/spec/examples/templates/template_liquid.rb +29 -0
  433. data/spec/examples/templates/template_markaby.rb +23 -0
  434. data/spec/examples/templates/template_redcloth.rb +28 -0
  435. data/spec/examples/templates/template_remarkably.rb +23 -0
  436. data/spec/examples/templates/template_tenjin.rb +28 -0
  437. data/spec/helper.rb +3 -0
  438. data/spec/ramaze/action/basics.rb +36 -0
  439. data/spec/ramaze/action/cache.rb +87 -0
  440. data/spec/ramaze/action/file_cache.rb +70 -0
  441. data/spec/ramaze/action/layout.rb +190 -0
  442. data/spec/ramaze/action/render.rb +31 -0
  443. data/spec/ramaze/action/view/bar.xhtml +1 -0
  444. data/spec/ramaze/action/view/instancevars/layout.xhtml +1 -0
  445. data/spec/ramaze/action/view/other_wrapper.xhtml +1 -0
  446. data/spec/ramaze/action/view/single_wrapper.xhtml +1 -0
  447. data/spec/ramaze/action/view/sub/sub_wrapper.xhtml +1 -0
  448. data/spec/ramaze/adapter/ebb.rb +12 -0
  449. data/spec/ramaze/adapter/mongrel.rb +12 -0
  450. data/spec/ramaze/adapter/record.rb +31 -0
  451. data/spec/ramaze/adapter/webrick.rb +12 -0
  452. data/spec/ramaze/adapter.rb +49 -0
  453. data/spec/ramaze/cache.rb +140 -0
  454. data/spec/ramaze/controller/actionless_templates.rb +32 -0
  455. data/spec/ramaze/controller/resolve.rb +32 -0
  456. data/spec/ramaze/controller/subclass.rb +36 -0
  457. data/spec/ramaze/controller/template_resolving.rb +113 -0
  458. data/spec/ramaze/controller/view/bar.xhtml +1 -0
  459. data/spec/ramaze/controller/view/base/another.xhtml +1 -0
  460. data/spec/ramaze/controller/view/greet.xhtml +1 -0
  461. data/spec/ramaze/controller/view/list.xhtml +1 -0
  462. data/spec/ramaze/controller/view/other/greet/other.xhtml +1 -0
  463. data/spec/ramaze/controller/view/other_wrapper.xhtml +1 -0
  464. data/spec/ramaze/controller.rb +180 -0
  465. data/spec/ramaze/current/request.rb +30 -0
  466. data/spec/ramaze/current/session.rb +97 -0
  467. data/spec/ramaze/dispatcher/directory.rb +55 -0
  468. data/spec/ramaze/dispatcher/file.rb +60 -0
  469. data/spec/ramaze/dispatcher/public/favicon.ico +0 -0
  470. data/spec/ramaze/dispatcher/public/file name.txt +1 -0
  471. data/spec/ramaze/dispatcher/public/test_download.css +141 -0
  472. data/spec/ramaze/dispatcher.rb +31 -0
  473. data/spec/ramaze/element.rb +107 -0
  474. data/spec/ramaze/error.rb +94 -0
  475. data/spec/ramaze/gestalt.rb +131 -0
  476. data/spec/ramaze/helper/aspect.rb +101 -0
  477. data/spec/ramaze/helper/auth.rb +66 -0
  478. data/spec/ramaze/helper/cache.rb +160 -0
  479. data/spec/ramaze/helper/cgi.rb +43 -0
  480. data/spec/ramaze/helper/file.rb +18 -0
  481. data/spec/ramaze/helper/flash.rb +133 -0
  482. data/spec/ramaze/helper/form.rb +118 -0
  483. data/spec/ramaze/helper/formatting.rb +54 -0
  484. data/spec/ramaze/helper/link.rb +124 -0
  485. data/spec/ramaze/helper/pager.rb +99 -0
  486. data/spec/ramaze/helper/partial.rb +88 -0
  487. data/spec/ramaze/helper/redirect.rb +112 -0
  488. data/spec/ramaze/helper/simple_captcha.rb +22 -0
  489. data/spec/ramaze/helper/stack.rb +73 -0
  490. data/spec/ramaze/helper/user.rb +43 -0
  491. data/spec/ramaze/helper/view/locals.xhtml +1 -0
  492. data/spec/ramaze/helper/view/loop.xhtml +4 -0
  493. data/spec/ramaze/helper/view/num.xhtml +1 -0
  494. data/spec/ramaze/helper/view/partial.xhtml +1 -0
  495. data/spec/ramaze/helper/view/recursive.xhtml +8 -0
  496. data/spec/ramaze/helper/view/recursive_local_ivars.xhtml +7 -0
  497. data/spec/ramaze/helper/view/recursive_locals.xhtml +7 -0
  498. data/spec/ramaze/helper/view/test_template.xhtml +1 -0
  499. data/spec/ramaze/localize.rb +89 -0
  500. data/spec/ramaze/log/informer.rb +72 -0
  501. data/spec/ramaze/log/syslog.rb +73 -0
  502. data/spec/ramaze/morpher.rb +111 -0
  503. data/spec/ramaze/params.rb +157 -0
  504. data/spec/ramaze/public/error404.xhtml +1 -0
  505. data/spec/ramaze/public/favicon.ico +0 -0
  506. data/spec/ramaze/public/ramaze.png +0 -0
  507. data/spec/ramaze/public/test_download.css +141 -0
  508. data/spec/ramaze/request/ebb.rb +9 -0
  509. data/spec/ramaze/request/mongrel.rb +9 -0
  510. data/spec/ramaze/request/thin.rb +9 -0
  511. data/spec/ramaze/request/webrick.rb +5 -0
  512. data/spec/ramaze/request.rb +185 -0
  513. data/spec/ramaze/rewrite/file.css +1 -0
  514. data/spec/ramaze/rewrite.rb +36 -0
  515. data/spec/ramaze/route.rb +131 -0
  516. data/spec/ramaze/session.rb +94 -0
  517. data/spec/ramaze/store/default.rb +71 -0
  518. data/spec/ramaze/struct.rb +47 -0
  519. data/spec/ramaze/template/amrita2/external.amrita +6 -0
  520. data/spec/ramaze/template/amrita2/sum.amrita +1 -0
  521. data/spec/ramaze/template/amrita2.rb +50 -0
  522. data/spec/ramaze/template/builder/external.rxml +3 -0
  523. data/spec/ramaze/template/builder.rb +51 -0
  524. data/spec/ramaze/template/erubis/sum.rhtml +1 -0
  525. data/spec/ramaze/template/erubis.rb +41 -0
  526. data/spec/ramaze/template/ezamar/another/long/action.zmr +1 -0
  527. data/spec/ramaze/template/ezamar/combined.zmr +1 -0
  528. data/spec/ramaze/template/ezamar/file_only.zmr +1 -0
  529. data/spec/ramaze/template/ezamar/index.zmr +1 -0
  530. data/spec/ramaze/template/ezamar/nested.zmr +1 -0
  531. data/spec/ramaze/template/ezamar/other__index.xhtml +1 -0
  532. data/spec/ramaze/template/ezamar/some__long__action.zmr +1 -0
  533. data/spec/ramaze/template/ezamar/sum.zmr +1 -0
  534. data/spec/ramaze/template/ezamar.rb +63 -0
  535. data/spec/ramaze/template/haml/index.haml +5 -0
  536. data/spec/ramaze/template/haml/locals.haml +2 -0
  537. data/spec/ramaze/template/haml/with_vars.haml +4 -0
  538. data/spec/ramaze/template/haml.rb +66 -0
  539. data/spec/ramaze/template/liquid/index.liquid +1 -0
  540. data/spec/ramaze/template/liquid/products.liquid +45 -0
  541. data/spec/ramaze/template/liquid.rb +99 -0
  542. data/spec/ramaze/template/markaby/external.mab +8 -0
  543. data/spec/ramaze/template/markaby/sum.mab +1 -0
  544. data/spec/ramaze/template/markaby.rb +61 -0
  545. data/spec/ramaze/template/nagoro/another/long/action.nag +1 -0
  546. data/spec/ramaze/template/nagoro/combined.nag +1 -0
  547. data/spec/ramaze/template/nagoro/file_only.nag +1 -0
  548. data/spec/ramaze/template/nagoro/index.nag +1 -0
  549. data/spec/ramaze/template/nagoro/nested.nag +1 -0
  550. data/spec/ramaze/template/nagoro/some__long__action.nag +1 -0
  551. data/spec/ramaze/template/nagoro/sum.nag +1 -0
  552. data/spec/ramaze/template/nagoro.rb +64 -0
  553. data/spec/ramaze/template/ramaze/external.test +1 -0
  554. data/spec/ramaze/template/redcloth/external.redcloth +1 -0
  555. data/spec/ramaze/template/redcloth.rb +38 -0
  556. data/spec/ramaze/template/remarkably/external.rem +8 -0
  557. data/spec/ramaze/template/remarkably/sum.rem +1 -0
  558. data/spec/ramaze/template/remarkably.rb +58 -0
  559. data/spec/ramaze/template/sass/file.css.sass +5 -0
  560. data/spec/ramaze/template/sass.rb +69 -0
  561. data/spec/ramaze/template/tagz/external.tagz +8 -0
  562. data/spec/ramaze/template/tagz/sum.tagz +1 -0
  563. data/spec/ramaze/template/tagz.rb +62 -0
  564. data/spec/ramaze/template/tenjin/external.tenjin +1 -0
  565. data/spec/ramaze/template/tenjin.rb +47 -0
  566. data/spec/ramaze/template/xslt/concat_words.xsl +16 -0
  567. data/spec/ramaze/template/xslt/index.xsl +14 -0
  568. data/spec/ramaze/template/xslt/products.xsl +32 -0
  569. data/spec/ramaze/template/xslt/ruby_version.xsl +14 -0
  570. data/spec/ramaze/template/xslt.rb +90 -0
  571. data/spec/ramaze/template.rb +128 -0
  572. data/spec/snippets/array/put_within.rb +33 -0
  573. data/spec/snippets/binding/locals.rb +9 -0
  574. data/spec/snippets/divide.rb +19 -0
  575. data/spec/snippets/kernel/constant.rb +23 -0
  576. data/spec/snippets/numeric/filesize_format.rb +12 -0
  577. data/spec/snippets/numeric/time.rb +12 -0
  578. data/spec/snippets/object/__dir__.rb +8 -0
  579. data/spec/snippets/object/acquire.rb +71 -0
  580. data/spec/snippets/ordered_set.rb +63 -0
  581. data/spec/snippets/ramaze/caller_info.rb +39 -0
  582. data/spec/snippets/ramaze/caller_lines.rb +30 -0
  583. data/spec/snippets/string/camel_case.rb +25 -0
  584. data/spec/snippets/string/color.rb +11 -0
  585. data/spec/snippets/string/snake_case.rb +24 -0
  586. data/spec/snippets/string/unindent.rb +43 -0
  587. data/spec/snippets/thread/into.rb +20 -0
  588. metadata +823 -0
@@ -0,0 +1,135 @@
1
+ # auto_params.rb
2
+ #
3
+ # AutoParams implements action parameterization ala merb 0.4 and Nitro
4
+ # using ruby2ruby and ParseTree
5
+ #
6
+ # Usage:
7
+ #
8
+ # Ramaze.contrib :auto_params
9
+ #
10
+ # Then, for example,
11
+ #
12
+ # def search(query) end
13
+ #
14
+ # can be accessed via
15
+ #
16
+ # - /search?query=findthis, which calls search('findthis')
17
+ # - /search/findthis search('findthis')
18
+ # - /search/findthis?query=andthis search(['findthis', 'andthis'])
19
+ #
20
+ # For more examples, take a look at spec/contrib/auto_params.rb
21
+ #
22
+ # Note: A simpler alternative for similar functionality would be:
23
+ #
24
+ # def search(query = request['query']) end
25
+ #
26
+
27
+ require __DIR__/:auto_params/:get_args
28
+
29
+ module Ramaze
30
+
31
+ module Contrib
32
+ class AutoParams
33
+ def self.startup
34
+ Ramaze::Cache.add :args
35
+ end
36
+ end
37
+ end
38
+
39
+ class Action
40
+
41
+ # with parameterization, params may include
42
+ # arrays: /num?n=1&n=2 becomes [['1','2']] for def num(n) end
43
+ # nil: /calc?w=10&d=2 becomes ['10', nil, '2'] for def calc(w, h, d) end
44
+
45
+ def params=(*par)
46
+ par = *par
47
+ self[:params] = par.map{ |pa|
48
+ case pa
49
+ when Array
50
+ pa.map{|p| Rack::Utils.unescape(p)}
51
+ when nil
52
+ nil
53
+ else
54
+ Rack::Utils.unescape(pa)
55
+ end
56
+ } unless par.nil?
57
+ self[:params] ||= []
58
+ end
59
+
60
+ end
61
+
62
+ class Controller
63
+
64
+ # ignore cache when request.params is interesting
65
+
66
+ def self.cached(path)
67
+ if found = Cache.resolved[path]
68
+ if found.respond_to?(:relaxed_hash)
69
+
70
+ # don't use cache if we need to add request.params entries to the Action
71
+ if args = Cache.args[found.method]
72
+ param_keys = request.params.keys
73
+ return nil if args.find{|k,v| param_keys.include?(k.to_s) }
74
+ end
75
+
76
+ return found.dup
77
+ else
78
+ Log.warn("Found faulty `#{path}' in Cache.resolved, deleting it for sanity.")
79
+ Cache.resolved.delete path
80
+ end
81
+ end
82
+
83
+ nil
84
+ end
85
+
86
+ # use Method#get_args to insert values from request.params into Action#params
87
+
88
+ def self.resolve_method(name, *params)
89
+ if method = [ name, name.gsub('__','/') ].find{|n|
90
+ cached_action_methods.include?(n) }
91
+ meth = instance_method(method)
92
+ arity = meth.arity
93
+
94
+ if meth.respond_to? :get_args
95
+ unless args = Cache.args[name]
96
+ if args = meth.get_args
97
+ args = args.select{|e| e.to_s !~ /^\*/}
98
+ else
99
+ args = []
100
+ end
101
+ Cache.args[name] = args
102
+ end
103
+
104
+ param_keys = request.params.keys
105
+
106
+ # if there are missing args, or keys in request.params that match expected args
107
+ if args.size > params.size or args.find{|k,v| param_keys.include?(k.to_s) }
108
+ args.each_with_index do |(name, val), i|
109
+ r_params = request.params[name.to_s]
110
+ if params[i] and r_params and r_params.size > 0
111
+ params[i] = [params[i], r_params].flatten
112
+ else
113
+ params[i] ||= r_params
114
+ end
115
+ end
116
+
117
+ # strip trailing nils so default argument values are used
118
+ params.reverse.each{|e| if e.nil? then params.pop else break end }
119
+ end
120
+
121
+ argity = args.select{|e| e.size==1}.size..args.size
122
+ else
123
+ argity = arity..arity
124
+ end
125
+
126
+ if arity < 0 or argity.include? params.size
127
+ return method, params
128
+ end
129
+ end
130
+ return nil, []
131
+ end
132
+
133
+ end
134
+
135
+ end
@@ -0,0 +1,84 @@
1
+ # EmailHelper can be used as a simple way to send basic e-mails from your app.
2
+ #
3
+ # Usage:
4
+ #
5
+ # require 'ramaze/contrib/email'
6
+ #
7
+ # # Set the required traits:
8
+ # Ramaze::EmailHelper.trait :smtp_server => 'smtp.your-isp.com',
9
+ # :smtp_helo_domain => "originating-server.com",
10
+ # :smtp_username => 'username',
11
+ # :smtp_password => 'password',
12
+ # :sender_address => 'no-reply@your-domain.com'
13
+ #
14
+ # # Optionally, set some other traits:
15
+ # Ramaze::EmailHelper.trait :smtp_auth_type => :login,
16
+ # :bcc_addresses => [ 'admin@your-domain.com' ],
17
+ # :sender_full => 'MailBot <no-reply@your-domain.com>',
18
+ # :id_generator => lambda { "<#{Time.now.to_i}@your-domain.com>" },
19
+ # :subject_prefix => "[SiteName]"
20
+ #
21
+ # To send an e-mail:
22
+ #
23
+ # Ramaze::EmailHelper.send(
24
+ # "foo@foobarmail.com",
25
+ # "Your fooness",
26
+ # "Hey, you are very fooey!"
27
+ # )
28
+
29
+ require 'net/smtp'
30
+
31
+ module Ramaze
32
+ class EmailHelper
33
+ # Required to be set
34
+ trait :smtp_server => 'smtp.your-isp.com'
35
+ trait :smtp_helo_domain => 'your.helo.domain.com'
36
+ trait :smtp_username => 'no-username-set'
37
+ trait :smtp_password => ''
38
+ trait :sender_address => 'no-reply@your-domain.com'
39
+
40
+ # Optionally set
41
+ trait :smtp_port => 25
42
+ trait :smtp_auth_type => :login
43
+ trait :bcc_addresses => []
44
+ trait :sender_full => nil
45
+ trait :id_generator => lambda { "<" + Time.now.to_i.to_s + "@" + trait[ :smtp_helo_domain ] + ">" }
46
+ trait :subject_prefix => ""
47
+
48
+ class << self
49
+ def send(recipient, subject, message)
50
+ {:recipient => recipient, :subject => subject, :message => message}.each do |k,v|
51
+ if v.nil? or v.empty?
52
+ raise(ArgumentError, "EmailHelper error: Missing or invalid #{k}: #{v.inspect}")
53
+ end
54
+ end
55
+ sender = trait[:sender_full] || "#{trait[:sender_address]} <#{trait[:sender_address]}>"
56
+ subject = [trait[:subject_prefix], subject].join(' ').strip
57
+ id = trait[:id_generator].call
58
+ email = %{From: #{sender}
59
+ To: <#{recipient}>
60
+ Date: #{Time.now.rfc2822}
61
+ Subject: #{subject}
62
+ Message-Id: #{id}
63
+
64
+ #{message}
65
+ }
66
+
67
+ send_smtp( email, recipient, subject )
68
+ end
69
+
70
+ def send_smtp( email, recipient, subject )
71
+ options = trait.values_at(:smtp_server, :smtp_port, :smtp_helo_domain,
72
+ :smtp_username, :smtp_password, :smtp_auth_type)
73
+
74
+ Net::SMTP.start( *options ) do |smtp|
75
+ smtp.send_message( email, trait[ :sender_address ], Array[ recipient, *trait[ :bcc_addresses ] ] )
76
+ Log.info "E-mail sent to #{recipient} - '#{subject}'"
77
+ end
78
+ rescue => e
79
+ Log.error "Failed to send e-mail to #{recipient}"
80
+ Log.error [ e.class.to_s, e.message, *e.backtrace ].join( "\t\n" )
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,171 @@
1
+ require 'rubygems'
2
+ require 'socket'
3
+ require 'digest'
4
+ require 'json'
5
+ require 'cgi'
6
+
7
+ module Facebook
8
+ class Error < StandardError
9
+ end
10
+
11
+ class APIProxy
12
+ instance_methods.each { |m| undef_method m unless m =~ /^__/ }
13
+
14
+ def initialize name, client
15
+ @name, @client = name, client
16
+ end
17
+
18
+ def method_missing method, opts = {}
19
+ @client.call "#{@name}.#{method}", opts
20
+ end
21
+ end
22
+
23
+ class Client
24
+ include Ramaze::Trinity if defined? Ramaze
25
+
26
+ def initialize keepalive = true
27
+ @keepalive = keepalive
28
+ @proxies = {}
29
+ end
30
+
31
+ %w[ auth fbml feed fql friends notifications profile users pages events groups photos marketplace ].each do |n|
32
+ define_method(n){ @proxies[n] ||= APIProxy.new(n, self) }
33
+ end
34
+
35
+ def call method, opts = {}
36
+ args = { :api_key => KEY,
37
+ :call_id => Time.now.to_f,
38
+ :format => 'JSON',
39
+ :v => '1.0',
40
+ :session_key => params[:session_key] || SESSION,
41
+ :method => method }.merge(opts).map{ |k,v|
42
+ "#{k}=" + case v
43
+ when Hash
44
+ v.to_json
45
+ when Array
46
+ v.join(',')
47
+ else
48
+ v.to_s
49
+ end
50
+ }.sort
51
+
52
+ data = Array["sig=#{Digest::MD5.hexdigest(args.join+SECRET)}", *args].join('&')
53
+
54
+ begin
55
+ ret = post(data)
56
+ rescue Errno::ECONNRESET, Errno::EPIPE
57
+ @server = connect
58
+ retry
59
+ end while ret.empty? and @server = connect
60
+
61
+ ret = case
62
+ when ret == 'true': true
63
+ when ret == 'false': false
64
+ when ret[0..0] == '"': ret[1..-2]
65
+ else
66
+ begin
67
+ JSON::parse(ret)
68
+ rescue JSON::ParserError
69
+ puts "Error parsing #{ret.inspect}"
70
+ raise
71
+ end
72
+ end
73
+
74
+ unless method == 'fql.query'
75
+ ret = ret.first if ret.is_a? Array and ret.size == 1 and ret.first.is_a? Hash
76
+ end
77
+
78
+ raise Facebook::Error, ret['error_msg'] if ret.is_a? Hash and ret['error_code']
79
+
80
+ ret
81
+ ensure
82
+ unless @keepalive
83
+ @server.close
84
+ @server = nil
85
+ end
86
+ end
87
+
88
+ def valid?
89
+ return false unless respond_to?(:request) and not request['fb_sig'].nil?
90
+ request['facebook.valid?'] ||= \
91
+ request['fb_sig'] == Digest::MD5.hexdigest(request.params.map{|k,v| "#{$1}=#{v}" if k =~ /^fb_sig_(.+)$/ }.compact.sort.join+SECRET)
92
+ end
93
+
94
+ def [] key
95
+ params[key]
96
+ end
97
+
98
+ def redirect url
99
+ url[0,0] = URL unless url =~ /^http/
100
+ if respond_to?(:response)
101
+ response.build "<fb:redirect url='#{url}'/>"
102
+ throw :respond
103
+ else
104
+ "<fb:redirect url='#{url}'/>"
105
+ end
106
+ end
107
+
108
+ def addurl goto = '/'
109
+ "http://apps.facebook.com/add.php?api_key=#{KEY}&next=#{CGI.escape '?next='+goto}"
110
+ end
111
+
112
+ def params
113
+ return {} unless valid?
114
+ request['facebook'] ||= \
115
+ request.params.inject({}) { |h,(k,v)|
116
+ next h unless k =~ /^fb_sig_(.+)$/
117
+ k = $1.to_sym
118
+
119
+ case k.to_s
120
+ when 'friends'
121
+ h[k] = v.split(',').map{|e|e.to_i}
122
+ when /time$/
123
+ h[k] = Time.at(v.to_f)
124
+ when 'expires'
125
+ v = v.to_i
126
+ h[k] = v>0 ? Time.at(v) : v
127
+ when 'user'
128
+ h[k] = v.to_i
129
+ when /^(position_|in_|is_|added)/
130
+ h[k] = v=='1'
131
+ else
132
+ h[k] = v
133
+ end
134
+ h
135
+ }
136
+ end
137
+
138
+ private
139
+
140
+ def connect
141
+ @socket.close if @socket
142
+ TCPSocket.new('api.facebook.com', 80)
143
+ end
144
+
145
+ def post data
146
+ @server ||= connect
147
+
148
+ @server.puts "POST /restserver.php HTTP/1.1\r\n"
149
+ @server.puts "Host: api.facebook.com\r\n"
150
+ @server.puts "Connection: keep-alive\r\n" if @keepalive
151
+ @server.puts "Content-Type: application/x-www-form-urlencoded\r\n"
152
+ @server.puts "Content-Length: #{data.length}\r\n"
153
+ @server.puts "\r\n#{data}\r\n"
154
+ @server.puts "\r\n\r\n"
155
+
156
+ buf = ''
157
+ while @server.gets
158
+ if $_ == "\r\n"
159
+ @server.gets
160
+ if $_.strip! == '0'
161
+ @server.gets
162
+ break
163
+ end
164
+ buf << @server.read($_.to_i(16))
165
+ end
166
+ end
167
+
168
+ buf
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,23 @@
1
+ require __DIR__/:facebook/:facebook
2
+
3
+ module Ramaze
4
+ module Helper::Facebook
5
+ def self.included(klass)
6
+ klass.send(:helper, :aspect)
7
+ end
8
+
9
+ def error
10
+ if Facebook::ADMINS.include? facebook[:user]
11
+ error = Ramaze::Dispatcher::Error.current
12
+ [error, *error.backtrace].join '<br/>'
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def facebook
19
+ @facebook ||= Facebook::Client.new
20
+ end
21
+ alias fb facebook
22
+ end
23
+ end
@@ -0,0 +1,65 @@
1
+ #
2
+ # drop-in replacement for Ramaze's built-in MemoryCache built on the
3
+ # filesystem. # to use with sessions do
4
+ #
5
+ # Ramaze::Global::cache_alternative[:sessions] = Ramaze::FileCache
6
+ #
7
+ # to use with everything do
8
+ #
9
+ # Ramaze::Global::cache = Ramaze::FileCache
10
+ #
11
+
12
+ module Ramaze::FileCache
13
+ require "fileutils"
14
+ require "socket"
15
+
16
+ Host = Socket.gethostname
17
+ Pid = Process.pid
18
+ Fu = FileUtils
19
+ Root = File.join Ramaze::APPDIR, "cache"
20
+
21
+ Fu.mkdir_p(Root) rescue nil
22
+
23
+ def self.[] key
24
+ path = File.join Root, key, "data"
25
+ Marshal.load(IO.read(path))
26
+ rescue
27
+ nil
28
+ end
29
+
30
+ def self.[]= key, value
31
+ tmp = File.join Root, key, "data.#{ Host }.#{ Pid }"
32
+ dirname = File.join Root, key
33
+ path = File.join Root, key, "data"
34
+ data = Marshal.dump value
35
+ Fu.rm_rf dirname rescue nil
36
+ Fu.mkdir_p dirname rescue nil
37
+ open(tmp, 'w'){|fd| fd.write data}
38
+ Fu.mv tmp, path
39
+ rescue
40
+ nil
41
+ end
42
+
43
+ def self.values_at *keys
44
+ keys.map{|key| self[key]}
45
+ end
46
+
47
+ def self.delete *keys
48
+ keys.map do |key|
49
+ dirname = File.join Root, key
50
+ Fu.rm_rf dirname rescue next
51
+ end
52
+ end
53
+
54
+ def self.clear
55
+ Dir["#{ Root }/*"].each{|entry| Fu.rm_rf entry}
56
+ end
57
+
58
+ def self.new
59
+ self
60
+ end
61
+
62
+ def self.to_sym
63
+ name.split(%r/::/).last.to_sym
64
+ end
65
+ end
@@ -0,0 +1,78 @@
1
+ module Ramaze
2
+ module Gems
3
+ @gems = []
4
+
5
+ class << self
6
+ def gem(name, version = nil, options = {})
7
+ case version
8
+ when String
9
+ options[:version] = version
10
+ when Hash
11
+ options.merge!(version)
12
+ end
13
+
14
+ @gems << GemStone.new(name, options)
15
+ end
16
+
17
+ # options include:
18
+ # :install_dir => where to install gems
19
+ # :extconf => additional options for building extensions
20
+
21
+ def options opts = {}
22
+ @options ||= {}
23
+ @options.merge! opts unless opts.empty?
24
+ @options
25
+ end
26
+
27
+ def setup opts = {}
28
+ options(opts)
29
+ @gems.each{|gem| gem.setup }
30
+ end
31
+ end
32
+
33
+ class GemStone
34
+ attr_reader :name, :options
35
+
36
+ def initialize(name, options = {})
37
+ @name, @options = name, options
38
+ require 'rubygems/dependency_installer'
39
+ @installer = Gem::DependencyInstaller.new(@options)
40
+ end
41
+
42
+ def setup(ran = false)
43
+ Gem.activate(name, *[options[:version]].compact)
44
+ require options[:lib] || name
45
+ rescue LoadError => error
46
+ puts error
47
+ return if ran
48
+ install
49
+ setup(ran = true)
50
+ end
51
+
52
+ def install
53
+ if extconf = (options[:extconf] || Gems.options[:extconf])
54
+ old_argv = ARGV.clone
55
+ ARGV.replace extconf.split(' ')
56
+ end
57
+
58
+ print "Installing #{name}..."
59
+ @installer.install name, options[:version]
60
+ puts "done.\n\n"
61
+ ensure
62
+ ARGV.replace old_argv if extconf
63
+ end
64
+ end
65
+ end
66
+ end
67
+
68
+ __END__
69
+ Usage example:
70
+
71
+ module Ramaze::Gems
72
+ gem 'haml'
73
+ gem 'sequel', '>=1.2.0'
74
+ gem 'hpricot', :source => 'http://code.whytheluckystiff.net'
75
+ gem 'aws-s3', :lib => 'aws/s3'
76
+
77
+ setup
78
+ end
@@ -0,0 +1,155 @@
1
+ =begin
2
+ mo.rb - A simple class for operating GNU MO file.
3
+
4
+ Copyright (C) 2003-2006 Masao Mutoh
5
+ Copyright (C) 2002 Masahiro Sakai, Masao Mutoh
6
+ Copyright (C) 2001 Masahiro Sakai
7
+
8
+ Masahiro Sakai <s01397ms@sfc.keio.ac.jp>
9
+ Masao Mutoh <mutoh@highway.ne.jp>
10
+
11
+ You can redistribute this file and/or modify it under the same term
12
+ of Ruby. License of Ruby is included with Ruby distribution in
13
+ the file "README".
14
+
15
+ $Id: mo.rb,v 1.7 2006/06/11 15:36:20 mutoh Exp $
16
+ =end
17
+
18
+ require 'iconv'
19
+
20
+ class MOFile < Hash
21
+ class InvalidFormat < RuntimeError; end;
22
+
23
+ attr_reader :filename
24
+
25
+ Header = Struct.new(:magic,
26
+ :revision,
27
+ :nstrings,
28
+ :orig_table_offset,
29
+ :translated_table_offset,
30
+ :hash_table_size,
31
+ :hash_table_offset)
32
+
33
+ MAGIC_BIG_ENDIAN = "\x95\x04\x12\xde"
34
+ MAGIC_LITTLE_ENDIAN = "\xde\x12\x04\x95"
35
+
36
+ def self.open(arg = nil, output_charset = nil)
37
+ result = self.new(output_charset)
38
+ result.load(arg)
39
+ end
40
+
41
+ def initialize(output_charset = nil)
42
+ @filename = nil
43
+ @last_modified = nil
44
+ @little_endian = true
45
+ @output_charset = output_charset
46
+ super
47
+ end
48
+
49
+ def update!
50
+ if FileTest.exist?(@filename)
51
+ st = File.stat(@filename)
52
+ load(@filename) unless (@last_modified == [st.ctime, st.mtime])
53
+ else
54
+ puts "#{@filename} was lost." if $DEBUG
55
+ clear
56
+ end
57
+ self
58
+ end
59
+
60
+ def load(arg)
61
+ case arg
62
+ when String
63
+ begin
64
+ st = File.stat(arg)
65
+ @last_modified = [st.ctime, st.mtime]
66
+ rescue Exception
67
+ end
68
+ load_from_file(arg)
69
+ when IO
70
+ load_from_stream(arg)
71
+ end
72
+ @filename = arg
73
+ self
74
+ end
75
+
76
+ def load_from_stream(io)
77
+ magic = io.read(4)
78
+ case magic
79
+ when MAGIC_BIG_ENDIAN
80
+ @little_endian = false
81
+ when MAGIC_LITTLE_ENDIAN
82
+ @little_endian = true
83
+ else
84
+ raise InvalidFormat.new("Unknown signature %s" % magic.dump)
85
+ end
86
+
87
+ header = Header.new(magic, *(io.read(4 * 6).unpack(@little_endian ? 'V6' : 'N6')))
88
+ raise InvalidFormat.new(sprintf("file format revision %d isn't supported", header.revision)) if header.revision > 0
89
+
90
+ io.pos = header.orig_table_offset
91
+ orig_table_data = io.read((4 * 2) * header.nstrings).unpack(@little_endian ? 'V*' : 'N*')
92
+
93
+ io.pos = header.translated_table_offset
94
+ trans_table_data = io.read((4 * 2) * header.nstrings).unpack(@little_endian ? 'V*' : 'N*')
95
+
96
+ original_strings = Array.new(header.nstrings)
97
+ for i in 0...header.nstrings
98
+ io.pos = orig_table_data[i * 2 + 1]
99
+ original_strings[i] = io.read(orig_table_data[i * 2 + 0])
100
+ end
101
+
102
+ clear
103
+ for i in 0...header.nstrings
104
+ io.pos = trans_table_data[i * 2 + 1]
105
+ str = io.read(trans_table_data[i * 2 + 0])
106
+
107
+ if original_strings[i] == ""
108
+ if str
109
+ @charset = nil
110
+ @nplurals = nil
111
+ @plural = nil
112
+ str.each_line{|line|
113
+ if /^Content-Type:/i =~ line and /charset=((?:\w|-)+)/i =~ line
114
+ @charset = $1
115
+ elsif /^Plural-Forms:\s*nplurals\s*\=\s*(\d*);\s*plural\s*\=\s*([^;]*)\n?/ =~ line
116
+ @nplurals = $1
117
+ @plural = $2
118
+ end
119
+ break if @charset and @nplurals
120
+ }
121
+ @nplurals = "1" unless @nplurals
122
+ @plural = "0" unless @plural
123
+ end
124
+ else
125
+ if @output_charset
126
+ begin
127
+ str = Iconv.iconv(@output_charset, @charset, str).join if @charset
128
+ rescue Iconv::Failure
129
+ if $DEBUG
130
+ $stderr.print "@charset = ", @charset, "\n"
131
+ $stderr.print "@output_charset = ", @output_charset, "\n"
132
+ $stderr.print "msgid = ", original_strings[i], "\n"
133
+ $stderr.print "msgstr = ", str, "\n"
134
+ end
135
+ end
136
+ end
137
+ end
138
+ self[original_strings[i]] = str
139
+ end
140
+ self
141
+ end
142
+
143
+ def load_from_file(filename)
144
+ @filename = filename
145
+ File.open(filename, 'rb'){|f| load_from_stream(f)}
146
+ end
147
+
148
+ def set_comment(msgid_or_sym, comment)
149
+ #Do nothing
150
+ end
151
+
152
+
153
+ attr_accessor :little_endian, :path, :last_modified
154
+ attr_reader :charset, :nplurals, :plural
155
+ end