crystal 0.0.10 → 0.0.12

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 (419) hide show
  1. data/Rakefile +25 -0
  2. data/lib/crystal/controller/abstract_controller/micelaneous.rb +31 -0
  3. data/lib/crystal/controller/abstract_controller/render.rb +133 -0
  4. data/lib/crystal/controller/abstract_controller/responder.rb +17 -0
  5. data/lib/crystal/controller/abstract_controller.rb +60 -0
  6. data/lib/crystal/controller/controller_context.rb +7 -0
  7. data/lib/crystal/controller/http_controller.rb +43 -0
  8. data/lib/crystal/controller/processors/controller_caller.rb +40 -0
  9. data/lib/crystal/controller/processors/controller_error_handling.rb +53 -0
  10. data/lib/crystal/controller/processors/controller_logger.rb +13 -0
  11. data/lib/crystal/controller.rb +28 -0
  12. data/lib/crystal/conveyor/conveyor.rb +74 -0
  13. data/lib/crystal/conveyor/conveyors.rb +20 -0
  14. data/lib/crystal/conveyor/params.rb +22 -0
  15. data/lib/crystal/conveyor/processor.rb +68 -0
  16. data/lib/crystal/conveyor/processors/conveyor_logger.rb +24 -0
  17. data/lib/crystal/conveyor/workspace.rb +36 -0
  18. data/lib/crystal/conveyor.rb +29 -0
  19. data/lib/crystal/environment/config.rb +118 -0
  20. data/lib/crystal/environment/dependency_resolver.rb +107 -0
  21. data/lib/crystal/environment/environment.rb +5 -0
  22. data/lib/crystal/environment/files_helper.rb +42 -0
  23. data/lib/crystal/environment/logger.rb +21 -0
  24. data/lib/crystal/environment.rb +52 -0
  25. data/lib/crystal/html/controller_helpers/controller_url_helper.rb +52 -0
  26. data/lib/crystal/html/controller_helpers/flash_helper.rb +5 -0
  27. data/lib/crystal/html/flash.rb +40 -0
  28. data/lib/crystal/html/include_into_controller.rb +24 -0
  29. data/lib/crystal/html/processors/prepare_flash.rb +26 -0
  30. data/lib/crystal/html/processors/scoped_params.rb +30 -0
  31. data/lib/crystal/html/view_helpers/basic_html_helper.rb +83 -0
  32. data/lib/crystal/html/view_helpers/form_helper.rb +104 -0
  33. data/lib/crystal/html/view_helpers/javascript_helper.rb +18 -0
  34. data/lib/crystal/html/view_helpers/model_helper.rb +119 -0
  35. data/lib/crystal/html/view_helpers/view_url_helper.rb +66 -0
  36. data/lib/crystal/html.rb +28 -0
  37. data/lib/crystal/http/http.rb +21 -0
  38. data/lib/crystal/http/http_adapter.rb +30 -0
  39. data/lib/crystal/http/middleware/static_files.rb +20 -0
  40. data/lib/crystal/http/processors/evaluate_format.rb +22 -0
  41. data/lib/crystal/http/processors/http_logger.rb +15 -0
  42. data/lib/crystal/http/processors/http_writer.rb +48 -0
  43. data/lib/crystal/http/processors/prepare_params.rb +24 -0
  44. data/lib/crystal/http/rack_config.rb +15 -0
  45. data/lib/crystal/http/support/rack/rack_adapter.rb +65 -0
  46. data/lib/crystal/http/support/rack/request.rb +12 -0
  47. data/lib/crystal/http/support/rack/response.rb +39 -0
  48. data/lib/crystal/http.rb +47 -0
  49. data/lib/crystal/mailer/mail.rb +7 -0
  50. data/lib/crystal/mailer.rb +13 -0
  51. data/lib/crystal/profiles/web.rb +69 -0
  52. data/lib/crystal/profiles/web_require.rb +5 -0
  53. data/lib/crystal/remote/processors/remote_caller.rb +54 -0
  54. data/lib/crystal/remote/processors/remote_logger.rb +13 -0
  55. data/lib/crystal/remote/remote.rb +15 -0
  56. data/lib/crystal/remote.rb +9 -0
  57. data/lib/crystal/router/configurator.rb +23 -0
  58. data/lib/crystal/router/default_format_processor.rb +12 -0
  59. data/lib/crystal/router/default_router.rb +23 -0
  60. data/lib/crystal/router/named_router.rb +63 -0
  61. data/lib/crystal/router/processors/router.rb +22 -0
  62. data/lib/crystal/router/router.rb +218 -0
  63. data/lib/crystal/router/routing_helper.rb +17 -0
  64. data/lib/crystal/router.rb +19 -0
  65. data/lib/crystal/spec/controller.rb +15 -0
  66. data/lib/crystal/spec/environment.rb +41 -0
  67. data/lib/crystal/spec/http.rb +67 -0
  68. data/lib/crystal/spec/mail.rb +20 -0
  69. data/lib/crystal/spec/remote.rb +9 -0
  70. data/lib/crystal/spec/view.rb +10 -0
  71. data/lib/crystal/spec/xhtml.rb +33 -0
  72. data/lib/crystal/spec.rb +8 -0
  73. data/lib/crystal/support/active_support/micelaneous.rb +2 -0
  74. data/lib/crystal/support/active_support.rb +37 -28
  75. data/lib/crystal/support/addressable.rb +45 -0
  76. data/lib/crystal/support/buffered_logger.rb +38 -0
  77. data/lib/crystal/support/callbacks.rb +155 -0
  78. data/lib/crystal/support/exception.rb +21 -0
  79. data/lib/crystal/support/filters.rb +34 -0
  80. data/lib/crystal/support/format.rb +9 -0
  81. data/lib/crystal/support/gems.rb +12 -0
  82. data/lib/crystal/support/micon.rb +16 -0
  83. data/lib/crystal/support/mime.rb +11 -0
  84. data/lib/crystal/support/module.rb +44 -0
  85. data/lib/crystal/support/rson.rb +53 -0
  86. data/lib/crystal/support/ruby_ext_with_active_support.rb +4 -0
  87. data/lib/crystal/support/safe_hash.rb +135 -0
  88. data/lib/crystal/support/string.rb +26 -0
  89. data/lib/crystal/support.rb +42 -0
  90. data/lib/crystal/template/support/tilt.rb +68 -0
  91. data/lib/crystal/template/template.rb +244 -0
  92. data/lib/crystal/template/template_context.rb +57 -0
  93. data/lib/crystal/template.rb +21 -0
  94. data/lib/views/crystal_default_templates/development/error.html.erb +11 -0
  95. data/lib/views/crystal_default_templates/development/error.js.erb +1 -0
  96. data/readme.md +9 -5
  97. data/spec/_mailer/basic_spec.rb +110 -0
  98. data/spec/_mailer/helper.rb +6 -0
  99. data/spec/controller/abstract_controller_spec/views/OperationsOrderSpec/action.erb +1 -0
  100. data/spec/controller/abstract_controller_spec/views/ViewVariablesSpec/action.erb +10 -0
  101. data/spec/controller/abstract_controller_spec.rb +138 -0
  102. data/spec/controller/controller_context_spec/views/ItemSpec/actions.erb +4 -0
  103. data/spec/controller/controller_context_spec/views/ItemSpec/show.erb +0 -0
  104. data/spec/controller/controller_context_spec/views/ItemSpec/update.erb +0 -0
  105. data/spec/controller/controller_context_spec/views/NamespaceSpec/ClassSpec/show.erb +0 -0
  106. data/spec/controller/controller_context_spec/views/PageSpec/actions.erb +3 -0
  107. data/spec/controller/controller_context_spec/views/PageSpec/show.erb +0 -0
  108. data/spec/controller/controller_context_spec/views/namespace_spec/class_spec/update.erb +0 -0
  109. data/spec/controller/controller_context_spec.rb +123 -0
  110. data/spec/controller/controller_helper_spec/views/HelperMethodSpec/action.erb +1 -0
  111. data/spec/controller/controller_helper_spec/views/HelperSpec/action.erb +1 -0
  112. data/spec/controller/controller_helper_spec.rb +58 -0
  113. data/spec/controller/controller_render_spec/views/AlreadyRenderedSpec/action.erb +1 -0
  114. data/spec/controller/controller_render_spec/views/AlreadyRenderedSpec/custom_template.erb +1 -0
  115. data/spec/controller/controller_render_spec/views/AnotherActionSpec/another_action.erb +1 -0
  116. data/spec/controller/controller_render_spec/views/AnotherLayout/action.erb +1 -0
  117. data/spec/controller/controller_render_spec/views/ExplicitRenderSpec/action.erb +1 -0
  118. data/spec/controller/controller_render_spec/views/ExplicitRenderSpec/another_action.erb +1 -0
  119. data/spec/controller/controller_render_spec/views/ForbidPartialAsActionSpec/_action.erb +1 -0
  120. data/spec/controller/controller_render_spec/views/FormatSpec/action.html.erb +1 -0
  121. data/spec/controller/controller_render_spec/views/FormatSpec/action.js.erb +1 -0
  122. data/spec/controller/controller_render_spec/views/LayoutFiltersSpec/action_with_layout.erb +1 -0
  123. data/spec/controller/controller_render_spec/views/LayoutFiltersSpec/action_without_layout.erb +1 -0
  124. data/spec/controller/controller_render_spec/views/LayoutSpec/action.erb +1 -0
  125. data/spec/controller/controller_render_spec/views/layouts/admin.erb +1 -0
  126. data/spec/controller/controller_render_spec/views/layouts/app.html.erb +1 -0
  127. data/spec/controller/controller_render_spec/views/layouts/app.js.erb +1 -0
  128. data/spec/controller/controller_render_spec/views/some_template.erb +1 -0
  129. data/spec/controller/controller_render_spec/views/standalone.html.erb +1 -0
  130. data/spec/controller/controller_render_spec.rb +192 -0
  131. data/spec/controller/error_handling_spec/views/diferrent_error_handling_spec/a.erb +1 -0
  132. data/spec/controller/error_handling_spec/views/diferrent_error_handling_spec/b.erb +1 -0
  133. data/spec/controller/error_handling_spec/views/diferrent_error_handling_spec/c.erb +1 -0
  134. data/spec/controller/error_handling_spec.rb +97 -0
  135. data/spec/controller/helper.rb +21 -0
  136. data/spec/controller/http_controller_spec.rb +90 -0
  137. data/spec/conveyor/conveyor_spec.rb +124 -0
  138. data/spec/conveyor/helper.rb +8 -0
  139. data/spec/environment/_dependency_resolver_spec.rb +50 -0
  140. data/spec/environment/environment_spec/app/app_plugin/config/ec_layout +1 -0
  141. data/spec/environment/environment_spec/app/app_plugin/ec_some_file +1 -0
  142. data/spec/environment/environment_spec/app/config/config.test.yml +1 -0
  143. data/spec/environment/environment_spec/app/config/config.yml +2 -0
  144. data/spec/environment/environment_spec/gem_plugin/config/ec_layout +1 -0
  145. data/spec/environment/environment_spec.rb +87 -0
  146. data/spec/environment/helper.rb +4 -0
  147. data/spec/environment/logger_spec.rb +20 -0
  148. data/spec/environment/minimal_app_spec/app.rb +3 -0
  149. data/spec/environment/minimal_app_spec.rb +29 -0
  150. data/spec/environment/standard_app_spec.rb +65 -0
  151. data/spec/environment/standard_app_spec_data/config/init.rb +18 -0
  152. data/spec/environment/standard_app_spec_data/plugin_a/plugin_a.rb +7 -0
  153. data/spec/html/basic_html_helper_spec.rb +30 -0
  154. data/spec/html/flash_spec.rb +185 -0
  155. data/spec/html/form_helper_spec.rb +57 -0
  156. data/spec/html/helper.rb +31 -0
  157. data/spec/html/javascript_helper_spec.rb +16 -0
  158. data/spec/html/model_helper_spec.rb +66 -0
  159. data/spec/html/scoped_params_spec.rb +18 -0
  160. data/spec/html/url_helper_spec.rb +152 -0
  161. data/spec/http/helper.rb +9 -0
  162. data/spec/http/http_spec.rb +57 -0
  163. data/spec/http/http_spec_data/config/init.rb +7 -0
  164. data/spec/http/http_spec_data/plugin_b/plugin_b.rb +6 -0
  165. data/spec/integration/basic_spec/views/smoke_test_spec/action.erb +1 -0
  166. data/spec/integration/basic_spec.rb +83 -0
  167. data/spec/integration/helper.rb +10 -0
  168. data/spec/remote/helper.rb +20 -0
  169. data/spec/remote/remote_spec.rb +76 -0
  170. data/spec/router/basic_spec.rb +131 -0
  171. data/spec/router/configurator_spec.rb +30 -0
  172. data/spec/router/helper.rb +23 -0
  173. data/spec/router/integration_spec.rb +43 -0
  174. data/spec/support/callbacks_spec.rb +155 -0
  175. data/spec/support/filters_spec.rb +61 -0
  176. data/spec/support/helper.rb +7 -0
  177. data/spec/support/safe_hash_spec.rb +84 -0
  178. data/spec/template/helper.rb +8 -0
  179. data/spec/template/template_spec/file.erb +1 -0
  180. data/spec/template/template_spec/views/basic/custom_context.erb +1 -0
  181. data/spec/template/template_spec/views/basic/extension.erb +1 -0
  182. data/spec/template/template_spec/views/basic/general.html.erb +5 -0
  183. data/spec/template/template_spec/views/basic/non_existing_format.html.erb +0 -0
  184. data/spec/template/template_spec/views/format/format.erb +1 -0
  185. data/spec/template/template_spec/views/format/format.html.erb +1 -0
  186. data/spec/template/template_spec/views/format/format.js.erb +1 -0
  187. data/spec/template/template_spec/views/layout/basic/content.erb +1 -0
  188. data/spec/template/template_spec/views/layout/basic/layout.erb +1 -0
  189. data/spec/template/template_spec/views/layout/content_for/content.erb +3 -0
  190. data/spec/template/template_spec/views/layout/content_for/layout.erb +3 -0
  191. data/spec/template/template_spec/views/layout/format/content.html.erb +1 -0
  192. data/spec/template/template_spec/views/layout/format/content.js.erb +1 -0
  193. data/spec/template/template_spec/views/layout/format/layout.html.erb +1 -0
  194. data/spec/template/template_spec/views/layout/format/layout.js.erb +1 -0
  195. data/spec/template/template_spec/views/layout/nested_yield/a.erb +1 -0
  196. data/spec/template/template_spec/views/layout/nested_yield/layout.erb +1 -0
  197. data/spec/template/template_spec/views/layout/nested_yield/layout_b.erb +1 -0
  198. data/spec/template/template_spec/views/layout/same_context/a.erb +1 -0
  199. data/spec/template/template_spec/views/layout/same_context/b.erb +1 -0
  200. data/spec/template/template_spec/views/layout/same_context/layout.erb +1 -0
  201. data/spec/template/template_spec/views/nested/format/a.erb +1 -0
  202. data/spec/template/template_spec/views/nested/format/b.erb +1 -0
  203. data/spec/template/template_spec/views/nested/relative/a.erb +1 -0
  204. data/spec/template/template_spec/views/nested/relative/b.erb +1 -0
  205. data/spec/template/template_spec/views/nested/relative/c.erb +1 -0
  206. data/spec/template/template_spec/views/nested/shared/c.erb +1 -0
  207. data/spec/template/template_spec/views/nesting_format/_dialog.html.erb +1 -0
  208. data/spec/template/template_spec/views/nesting_format/_form.html.erb +1 -0
  209. data/spec/template/template_spec/views/nesting_format/dialog.js.erb +1 -0
  210. data/spec/template/template_spec/views/other/template.erb +1 -0
  211. data/spec/template/template_spec/views/prefixes/_underscored.erb +1 -0
  212. data/spec/template/template_spec/views/prefixes/without_prefix.erb +1 -0
  213. data/spec/template/template_spec.rb +190 -0
  214. data/spec/template/tilt_spec/views/concat_and_capture.erb +1 -0
  215. data/spec/template/tilt_spec/views/concat_and_capture.haml +3 -0
  216. data/spec/template/tilt_spec/views/errors.erb +3 -0
  217. data/spec/template/tilt_spec/views/errors.haml +3 -0
  218. data/spec/template/tilt_spec/views/mixed_templates/broken_erb_concat_erb.erb +4 -0
  219. data/spec/template/tilt_spec/views/mixed_templates/broken_erb_concat_haml.haml +1 -0
  220. data/spec/template/tilt_spec/views/mixed_templates/broken_haml_concat_erb.erb +1 -0
  221. data/spec/template/tilt_spec/views/mixed_templates/broken_haml_concat_haml.haml +2 -0
  222. data/spec/template/tilt_spec/views/nested_capture_and_concat.haml +3 -0
  223. data/spec/template/tilt_spec/views/ugly.haml +3 -0
  224. data/spec/template/tilt_spec/views/yield.erb +1 -0
  225. data/spec/template/tilt_spec.rb +97 -0
  226. metadata +345 -205
  227. data/.git/COMMIT_EDITMSG +0 -1
  228. data/.git/FETCH_HEAD +0 -1
  229. data/.git/HEAD +0 -1
  230. data/.git/ORIG_HEAD +0 -1
  231. data/.git/config +0 -12
  232. data/.git/description +0 -1
  233. data/.git/hooks/applypatch-msg.sample +0 -15
  234. data/.git/hooks/commit-msg.sample +0 -24
  235. data/.git/hooks/post-commit.sample +0 -8
  236. data/.git/hooks/post-receive.sample +0 -15
  237. data/.git/hooks/post-update.sample +0 -8
  238. data/.git/hooks/pre-applypatch.sample +0 -14
  239. data/.git/hooks/pre-commit.sample +0 -46
  240. data/.git/hooks/pre-rebase.sample +0 -169
  241. data/.git/hooks/prepare-commit-msg.sample +0 -36
  242. data/.git/hooks/update.sample +0 -128
  243. data/.git/index +0 -0
  244. data/.git/info/exclude +0 -6
  245. data/.git/logs/HEAD +0 -21
  246. data/.git/logs/refs/heads/master +0 -21
  247. data/.git/logs/refs/remotes/origin/master +0 -19
  248. data/.git/objects/00/c26dc781c8997ed2bfa61f03b323466a3860d1 +0 -0
  249. data/.git/objects/04/03ee94b34a5760c46616cd13c317e69cb90d56 +0 -0
  250. data/.git/objects/04/6f30de5fd9fe81fd558c58091c38a57b6be727 +0 -0
  251. data/.git/objects/05/78d884154d5a74143844a4373121e8d9fa6abd +0 -0
  252. data/.git/objects/06/8c594d16214cbee3ad8e9f4eae9c78f6a9ddf1 +0 -3
  253. data/.git/objects/08/8b766b31125f7c4ae34a8fc50b23842cd3d329 +0 -0
  254. data/.git/objects/09/66c6b45bacaae9282463b9b4c0ce8488bbcee5 +0 -2
  255. data/.git/objects/09/a40c814899fcdadc2bd5665e892a7db26a3677 +0 -2
  256. data/.git/objects/0c/eac702c4548a2748f50793ea5108cfd4937568 +0 -0
  257. data/.git/objects/0d/03131f9fbc3e2fb1f8f9b616ac273d05f3a7f5 +0 -0
  258. data/.git/objects/0e/50f691a65b41ba9e7df9d6738ff9f333089b34 +0 -0
  259. data/.git/objects/11/72a42d5efc6cb442f877bef4427321a216990a +0 -1
  260. data/.git/objects/12/3a3f6e3c82bb8df88e242085deef1aa150039c +0 -0
  261. data/.git/objects/14/6253750089fd522535155630344c8ff2a60830 +0 -0
  262. data/.git/objects/15/3d7375df50713dd61152db972492405e5475e0 +0 -0
  263. data/.git/objects/15/f5669d470665c6bd28b5ab7b65431e199c36e9 +0 -0
  264. data/.git/objects/1b/d4b59edc03948d15434e9eb882c769ab779ba6 +0 -0
  265. data/.git/objects/1c/abe7402ff0ea8bbf7a63cee7a61dec7578dae9 +0 -0
  266. data/.git/objects/20/fb67fdc8a63361a3d317d3c873462fd5a338d0 +0 -0
  267. data/.git/objects/21/4bb3dd51d883243c744ee3d668e09a0c1cc293 +0 -0
  268. data/.git/objects/23/9d84cdccd97f779f60c08f88ab635f4c236e87 +0 -0
  269. data/.git/objects/27/510002446b0a1405c1e7f14634c28407dffa76 +0 -0
  270. data/.git/objects/28/4db1992e17d1d5fc9280dc4e79799958a9cbac +0 -0
  271. data/.git/objects/28/69649fc37831734b82493fe980f9dc65dfd935 +0 -0
  272. data/.git/objects/28/a3d1b3c79d0e59b8359ecd75e4ec0d62f60468 +0 -2
  273. data/.git/objects/29/53f684e47235f5b14b4beb0b0bb61c8e520dd8 +0 -0
  274. data/.git/objects/2c/b339709e1fb005a3e3006e76558d2e45333008 +0 -0
  275. data/.git/objects/2d/077a401db466ea0b1f062eac15293879293439 +0 -0
  276. data/.git/objects/2e/2f635a49a032cb37d69af4862181bb37bfa0fa +0 -0
  277. data/.git/objects/31/0f7c970910eced673e858c197f6ee418e97545 +0 -0
  278. data/.git/objects/34/7475671d8fbc0e870ce9ec1c6f275ddd90f1db +0 -0
  279. data/.git/objects/36/479605ef7fc62ec68841284083e171bcb3b2c2 +0 -2
  280. data/.git/objects/37/1221704ea1da5a27626855e82076565fb58cac +0 -0
  281. data/.git/objects/38/3af6cb155addf818eb9396229892743112dbc3 +0 -0
  282. data/.git/objects/3a/97679c02b93c246d359a6f663b513691e37991 +0 -0
  283. data/.git/objects/3b/101bd6fccf79321048448c8384029c8768ec01 +0 -0
  284. data/.git/objects/3d/4a702963039cf32ac2ca91c37669e78625f92b +0 -0
  285. data/.git/objects/40/55426e988e151ac26792ec17bf31d04c606377 +0 -0
  286. data/.git/objects/42/828defbc95389daf9bfa11c8b2341f98303ee7 +0 -0
  287. data/.git/objects/44/b6d8df4e1f924caeb7de56135c251ce24998fd +0 -0
  288. data/.git/objects/46/42a59703e31a105aa67c4511be5e41402d08af +0 -0
  289. data/.git/objects/49/22dc7ff543c31059ef3979c51ab36cdf74367e +0 -0
  290. data/.git/objects/49/3a5d4dfc291e68321e15120dd9ca15388817ff +0 -0
  291. data/.git/objects/4a/787ce4e048fe15df728e9b5e9170f087b0bcde +0 -4
  292. data/.git/objects/4b/f9324fefa911db32f9d75461842e3420254e7f +0 -0
  293. data/.git/objects/4d/ada0b46f7aedd3da02dbec0daef667b3903765 +0 -0
  294. data/.git/objects/50/dfa247b62156c4eb6371c8a68054c63aa1f075 +0 -2
  295. data/.git/objects/53/ae2a3872c30d9242b5ea4a609165c02da18392 +0 -0
  296. data/.git/objects/56/43b861a644b727a8b54ae003977151d975f360 +0 -0
  297. data/.git/objects/57/5fdffb0b6f624c9d2676964603788264ed7b28 +0 -0
  298. data/.git/objects/5a/53898e77d291396aeb2b7255d97d185b92cad2 +0 -0
  299. data/.git/objects/5c/bb5fbba6c1b72af9e412047c50e8629c681d72 +0 -1
  300. data/.git/objects/5e/11ba5e0794a914747bae95b942b2dbeb5c36c3 +0 -0
  301. data/.git/objects/5e/22424fba117a89e563604e2e55fca82ef7547a +0 -0
  302. data/.git/objects/5e/90e483ed4782b9a2a834280c6ad5e7711462fa +0 -0
  303. data/.git/objects/5e/f6eb87941331580ede445399654f199a9a6156 +0 -0
  304. data/.git/objects/5f/2b8b8c9f16877c91fda9a177e235698103c4c9 +0 -0
  305. data/.git/objects/61/8d3d8348db1739ba171f7db3effb3c7244bf3b +0 -2
  306. data/.git/objects/62/b4bbd793a5a9ad8b0f24ef657b973afbfcf3cf +0 -0
  307. data/.git/objects/62/fa8ffcffcedc680a953c2e01ca9312e60807b0 +0 -0
  308. data/.git/objects/63/82b66d637e3d04e78a6272e25d3e212de90a10 +0 -0
  309. data/.git/objects/65/b8ba705a4a439a8b26df539f10b97d6ca4988d +0 -1
  310. data/.git/objects/66/aa791f24ea2ed8717abe3d1c74da4ad544723d +0 -0
  311. data/.git/objects/68/02f5c496f00787242a9fa1a81eb9847071e076 +0 -0
  312. data/.git/objects/69/b1b39f438eb902f68ddd438119d2e74633d16f +0 -0
  313. data/.git/objects/6c/a1abc3f9fe344fddcedb7163848fe6111717ae +0 -0
  314. data/.git/objects/6d/003cf32b629086b5714d3ba0cb6b3ae296ff4e +0 -0
  315. data/.git/objects/6e/4e5c95547a5e088db2d6a9d3b52c446cfec1fb +0 -0
  316. data/.git/objects/6f/2b5882b4cb9c2ef42902433076b58ef5ce44b9 +0 -0
  317. data/.git/objects/71/d7d7da97da36d9899873715ccd080c2793cbe9 +0 -0
  318. data/.git/objects/7a/64ac4146eb137a2667085fbddfea97cc727bb7 +0 -2
  319. data/.git/objects/7b/47a3e0c3fb6407567185df38e031cb54179c6e +0 -0
  320. data/.git/objects/7c/34481a926b48e49767828aa8a3bbeeeb26643e +0 -0
  321. data/.git/objects/7c/4fb1fb0dfa094010b07e489dd6feaa0b15c316 +0 -0
  322. data/.git/objects/7d/97e0e697055b4fbf915cc3d662d4599b3b1477 +0 -0
  323. data/.git/objects/7f/0673a63b426d7025b0a11de29083490264b350 +0 -0
  324. data/.git/objects/81/031da1db90c4cd43fe27336054d76564dbe64c +0 -3
  325. data/.git/objects/81/1ad37e54ba756ff8d3acbbad733e43631c2de8 +0 -3
  326. data/.git/objects/81/f505f109391e66ba3de39165c66c41b8e5e0bb +0 -0
  327. data/.git/objects/82/1912a397a9029beb4d74f407a6ad4b8e36f2f2 +0 -0
  328. data/.git/objects/85/8d7587d219e75ac4eda5bc7b6d28e74d545146 +0 -0
  329. data/.git/objects/86/738c97b0d7ac8443a25cbcd0c4e147bcdb152e +0 -0
  330. data/.git/objects/86/edc0909929d735fe5e1cf8f8b46ad7fa2c1d60 +0 -0
  331. data/.git/objects/8b/722287d6667e73e07eab685f7bd7b32dbecb04 +0 -0
  332. data/.git/objects/8b/ef303f65e1da2f9054b8912cb952718ef99bba +0 -0
  333. data/.git/objects/8c/572af4f04bcafb3c226a669fbc4dc508aed651 +0 -0
  334. data/.git/objects/8d/a995e65577a82011df060b13a498f0a738d017 +0 -0
  335. data/.git/objects/8e/1980f27fbc85de9d530e3946ad9f4e78b96107 +0 -0
  336. data/.git/objects/8e/5b69ea615859da8ee6d7848ca754d8cca5ffc5 +0 -0
  337. data/.git/objects/90/cfb8df76866f20a0c9c4adfb6d5d1faebad9d3 +0 -0
  338. data/.git/objects/9f/e781c5e0fe8f889aefb163da0b52f9cf25ec1f +0 -2
  339. data/.git/objects/a4/fd740f28646783c68d1db592fa65a983d73e7b +0 -0
  340. data/.git/objects/a7/618ca140c7c16536cdbd864c8264d4e738d508 +0 -0
  341. data/.git/objects/a9/38b272a1a743d7e30caa05b5513760195ec0a8 +0 -4
  342. data/.git/objects/a9/4c0880d370e61595adda4af6e91209437265aa +0 -0
  343. data/.git/objects/aa/2420e96b6dcb848de2a8ea393c28a0314eda6e +0 -2
  344. data/.git/objects/aa/ddfc59430a3fb268bd5c97a088ea4bfdb2db07 +0 -0
  345. data/.git/objects/ac/3226f3722e8ea60a4ddcbc5b4a30d305fbdf50 +0 -0
  346. data/.git/objects/ad/8ddf80de972b932bc955c672c29e21f948367f +0 -0
  347. data/.git/objects/ad/994f9b41e5bc6fd188de9aa8adefe6b5515ed6 +0 -3
  348. data/.git/objects/af/606f60f63c31341fd75ec557e073435327cf82 +0 -0
  349. data/.git/objects/b1/244bb3652d56ebe4b465468e214d1a1fa87ebb +0 -1
  350. data/.git/objects/b2/1be06405e5a7e2db12e03d6a781c759b305a72 +0 -0
  351. data/.git/objects/b2/a45e92c20d09897c984186472f616c0af6b5d3 +0 -2
  352. data/.git/objects/b3/39ab5d14998e1bb098eb0b807fb9b53ecc790b +0 -0
  353. data/.git/objects/b3/838491c1c451ff8680fe25a7288d79e22c5ee9 +0 -1
  354. data/.git/objects/b4/e715329ba853104d19112487b1188571bca659 +0 -0
  355. data/.git/objects/b5/010cc435a10af9518f125b67851576c1e74835 +0 -0
  356. data/.git/objects/b5/9d6a5f9325cbd5a7ce3b351b51db1f1b6d58f9 +0 -0
  357. data/.git/objects/b6/e185313a1e82513d52144e80d97c4e7217a6b0 +0 -0
  358. data/.git/objects/b8/bd01ebc6defac18710776615168beb4e251e87 +0 -2
  359. data/.git/objects/b8/ca44e136c1392f27f617801a9ea908eaf45d0b +0 -0
  360. data/.git/objects/ba/c39f505b90f6e64cff088337293912161a4ca5 +0 -0
  361. data/.git/objects/bb/c21a34b3d2ddd51f3e39ddef3c6811aaa26305 +0 -0
  362. data/.git/objects/bf/1e07cd3085bed5be7f3ca1860ec8c14d0fdebb +0 -0
  363. data/.git/objects/bf/4d123f34ecf86a041a5d8df32beb6e1b24dfed +0 -0
  364. data/.git/objects/c0/aa97f36a0fdf80be4ca530ecf0ff7ec23fc313 +0 -0
  365. data/.git/objects/c2/759026a46887f199c46ee60ef9764fed87c7af +0 -0
  366. data/.git/objects/c3/6838a35e7acdbe40a8e762aa92e143d6be8376 +0 -0
  367. data/.git/objects/c5/73778609d449286e4eb5177d34e3c77b0cf520 +0 -0
  368. data/.git/objects/c5/945ab6909de8dd7f9e192a67fe72db2a7f5740 +0 -0
  369. data/.git/objects/c5/ef2f6ac4ee5779fa79f7afb54a458191352e86 +0 -0
  370. data/.git/objects/c6/c08bf8bd35fcf7fc9127a482badd7a9ff48ba2 +0 -0
  371. data/.git/objects/c6/c8485326187c9c872dedc68d71a2fe3ad15446 +0 -0
  372. data/.git/objects/cc/0b74e32ae045d3208839aa91d0dc94f5ea4c09 +0 -0
  373. data/.git/objects/cc/dd62a9a3a9e16e487495294c19ac64da9516d0 +0 -3
  374. data/.git/objects/cf/8ccc732db70ccfb4e185f78dc03512b04fb4f6 +0 -0
  375. data/.git/objects/d2/6b6bac449e70757e718bf023bd3c327b3f231c +0 -0
  376. data/.git/objects/d3/b4580aaa3c069e320b941dd23f56a474cd6caa +0 -3
  377. data/.git/objects/d4/5dffe5792c4d873de1cc233ec8992e9a9f8df5 +0 -0
  378. data/.git/objects/d7/ea5d3d4b7fdcc93771304fee8d5261f6469f28 +0 -0
  379. data/.git/objects/d8/53eba81fc4b75fbc90cf8c39f4b1344deddc9f +0 -0
  380. data/.git/objects/d8/de40b222d79af7bdb2b1ae59944fc3b0dd0f05 +0 -0
  381. data/.git/objects/df/39c68e0de1bee1b87beeb44170f52db5da2317 +0 -0
  382. data/.git/objects/df/e23416f16c0bb6c98ca2a0b1d02d803ff53831 +0 -0
  383. data/.git/objects/df/ee793cf3fd89820e5a9a4481d35000d75040d9 +0 -0
  384. data/.git/objects/e0/f7b971a634e34d7976676a4d575c654746a5f8 +0 -0
  385. data/.git/objects/e2/6ee4ee0aae4b71ab0fae46952e858050eb6380 +0 -0
  386. data/.git/objects/e5/134d62f67ad64eb79b139bb86ed8af711704d4 +0 -0
  387. data/.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 +0 -0
  388. data/.git/objects/e8/2061e7bc928cd8df2a4ac34848bd670d7cb29c +0 -0
  389. data/.git/objects/e8/2e9ddde8094f4d6f4871abe19f82acce46cafe +0 -0
  390. data/.git/objects/e9/0b6867602c5754080219c30aee275f3aa10b49 +0 -0
  391. data/.git/objects/e9/8264a4555c2b9436f7c8633575eb5cea338e35 +0 -0
  392. data/.git/objects/eb/86cc8e7187bdb75267a4e5ba1c5d4d4b200c98 +0 -0
  393. data/.git/objects/ee/282c9448793de0bd2df8348e0f4fd6cb1b8f2f +0 -0
  394. data/.git/objects/f0/2d1b4f22ec5df7fc658d4616cac5e5250e033b +0 -0
  395. data/.git/objects/f3/8245046bfe9c478a502c58b1c1434f382800d3 +0 -0
  396. data/.git/objects/f3/e1d5f3bc635974bf9410cb87d21bb3ad29da6b +0 -0
  397. data/.git/objects/f6/3c2e6d83a07cf107ff63a6b92a72a0ac5e9e3f +0 -0
  398. data/.git/objects/f8/a51fe3b4da3e5616ee4606fc71ef1915162853 +0 -0
  399. data/.git/objects/fb/0a0717fd1a64bfe6de89e84ce2f320e9bca527 +0 -0
  400. data/.git/objects/fc/794047fc246572581a7fdce016e1be6b8ab61a +0 -0
  401. data/.git/objects/fe/d4da51927e4d0b97d071611a3cb0c7c484938d +0 -0
  402. data/.git/objects/ff/db1bde1735cee2b62d80bf8151ae98515069b4 +0 -0
  403. data/.git/refs/heads/master +0 -1
  404. data/.git/refs/remotes/origin/master +0 -1
  405. data/.gitignore +0 -3
  406. data/bin/crystal_console +0 -45
  407. data/bin/crystal_new +0 -3
  408. data/bin/crystal_server +0 -6
  409. data/lib/crystal/core/config.rb +0 -52
  410. data/lib/crystal/core/crystal.rb +0 -40
  411. data/lib/crystal/core/remote.rb +0 -8
  412. data/lib/crystal/core/router.rb +0 -39
  413. data/lib/crystal/core/scopes.rb +0 -4
  414. data/lib/crystal/rack/adapter.rb +0 -57
  415. data/lib/crystal/rack/middleware/static_files.rb +0 -27
  416. data/lib/crystal/rack/rack_app.rb +0 -96
  417. data/lib/crystal/rack/support.rb +0 -55
  418. data/lib/crystal.rb +0 -37
  419. data/rakefile +0 -70
@@ -0,0 +1,36 @@
1
+ module Crystal
2
+ class Workspace < OpenObject
3
+ def params
4
+ self[:params] || Params.new
5
+ end
6
+
7
+ def params?
8
+ !!params
9
+ end
10
+
11
+ alias_method :set_without_params, :[]=
12
+ def []= k, v
13
+ if k.to_s == 'params'
14
+ self.params = v
15
+ else
16
+ set_without_params k, v
17
+ end
18
+ end
19
+
20
+ def params= v
21
+ if v.is_a? Params
22
+ set_without_params :params, v
23
+ else
24
+ set_without_params :params, Params.new(v)
25
+ end
26
+ end
27
+
28
+ def inspect
29
+ h = {}
30
+ each{|k, v| h[k.to_s] = v}
31
+ h['env'] = "..." if h.include? 'env'
32
+ h['request'] = "..." if h.include? 'request'
33
+ h.inspect
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,29 @@
1
+ # Conveyor is the heart of Crystal, it allows for Processors to process request and build responce.
2
+
3
+ require 'crystal/environment'
4
+
5
+ [
6
+ # 'config',
7
+ 'params',
8
+ 'workspace',
9
+ 'processor',
10
+ 'conveyor',
11
+ 'conveyors',
12
+ 'processors/conveyor_logger',
13
+ ].each{|f| require "crystal/conveyor/#{f}"}
14
+
15
+ Crystal.metaclass_eval do
16
+ inject :conveyors => :conveyors
17
+ end
18
+
19
+ #
20
+ # Initializations
21
+ #
22
+ crystal do
23
+ register :workspace, :scope => :cycle, :depends_on => :environment
24
+ register :conveyors, :depends_on => :environment do
25
+ Crystal::Conveyors.new
26
+ end
27
+ end
28
+
29
+ Crystal::Config::DEFAULTS['show_exceptions'] = false
@@ -0,0 +1,118 @@
1
+ module Crystal
2
+ class Config < SafeHash
3
+ inherit OpenConstructor
4
+
5
+ DEFAULTS = {
6
+ :environment => 'development',
7
+ }.stringify_keys
8
+
9
+ def initialize
10
+ super
11
+
12
+ config = DEFAULTS.clone
13
+ config.merge! Config.command_line_config if Config.command_line_config
14
+ config.each{|k, v| self.send "#{k}=", v}
15
+ end
16
+
17
+ def load_app_config!
18
+ return unless root?
19
+
20
+ # loading app_root/config/config.yml
21
+ cfile = "#{root!}/config/config.yml"
22
+ if File.exist? cfile
23
+ data = YAML.load_file cfile
24
+ if data
25
+ data.must_be.a Hash
26
+ data.each{|k, v| self[k] = v}
27
+ end
28
+ end
29
+
30
+ # loading app_root/config/config.<environment>.yml
31
+ env_cfile = "#{root!}/config/config.#{environment!}.yml"
32
+ if File.exist? env_cfile
33
+ data = YAML.load_file env_cfile
34
+ if data
35
+ data.must_be.a Hash
36
+ data.each{|k, v| self[k] = v}
37
+ end
38
+ end
39
+ end
40
+
41
+ #
42
+ # root
43
+ #
44
+ def root= root
45
+ if root
46
+ self['root'] = File.expand_path(root)
47
+ else
48
+ self.delete 'root'
49
+ end
50
+ end
51
+
52
+
53
+ #
54
+ # environment
55
+ #
56
+ def environment= env
57
+ env = env.to_s
58
+ env.must_be.in %w{production development test}
59
+ self['environment'] = env
60
+ end
61
+
62
+ def development?; environment == 'development' end
63
+ def production?; environment == 'production' end
64
+ def test?; environment == 'test' end
65
+
66
+
67
+ #
68
+ # log_path
69
+ #
70
+ attr_writer :log_path
71
+ def log_path
72
+ @log_path ||= root? ? "#{root}/log/#{environment}.log" : ""
73
+ end
74
+
75
+
76
+ #
77
+ # log_level
78
+ #
79
+ attr_writer :log_level
80
+ def log_level
81
+ @log_level ||= production? ? :info : :debug
82
+ end
83
+
84
+
85
+ #
86
+ # session
87
+ #
88
+ # :key => 'rack.session', :domain => 'foo.com', :path => '/', :expire_after => 2592000, :secret => 'change_me'
89
+ # attr_accessor :session
90
+ # def session?; !!session end
91
+
92
+
93
+ class << self
94
+ attr_accessor :command_line_config
95
+
96
+ def apply_command_line_arguments!
97
+ require 'optparse'
98
+
99
+ config = {}
100
+ case ARGV.first
101
+ when "p" then config['environment'] = "production"
102
+ when "d" then config['environment'] = "development"
103
+ when "t" then config['environment'] = "test"
104
+ end
105
+
106
+ OptionParser.new{|op|
107
+ op.on('-e env'){|val| config['environment'] = val}
108
+ op.on('-s server'){|val| config['server'] = val}
109
+ op.on('-p port'){|val| config['port'] = val.to_i}
110
+ }.parse!(ARGV.dup)
111
+
112
+ self.command_line_config = config
113
+ end
114
+
115
+ def defered_configs; @defered_configs ||= [] end
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,107 @@
1
+ # module Crystal
2
+ # class DependencyResolver
3
+ # class Dependency
4
+ # attr_accessor :name, :block, :before, :after
5
+ #
6
+ # def initialize name, block
7
+ # @name, @block = name, block
8
+ # @before, @after = [], []
9
+ # end
10
+ #
11
+ # def inspect
12
+ # "#<#{name} #{before.inspect}, #{after.inspect}>"
13
+ # end
14
+ # end
15
+ #
16
+ # def dependencies; @dependencies ||= {} end
17
+ #
18
+ # #
19
+ # # Define dependency
20
+ # #
21
+ # def run name, options = {}, &block
22
+ # options = options.to_openobject
23
+ # # raise "Invalid usage, you must specify :after or :before!" unless options.before? or options.after?
24
+ # d = Dependency.new name, block
25
+ #
26
+ # if options.before?
27
+ # add_dependency d, :before, options.before.must_be.present
28
+ # elsif options.after?
29
+ # add_dependency d, :after, options.after.must_be.present
30
+ # else
31
+ # add_dependency d, nil, nil
32
+ # end
33
+ # end
34
+ #
35
+ #
36
+ # #
37
+ # # Call dependencies
38
+ # #
39
+ # def call name, &block
40
+ # return unless dep = dependencies[name]
41
+ #
42
+ # # before
43
+ # callees = []
44
+ # dep_lists = [dep.before]
45
+ # while !dep_lists.empty?
46
+ # dep_lists.each do |list|
47
+ # callees << list
48
+ # end
49
+ #
50
+ # dep_lists = next_level dep_lists, :before
51
+ # end
52
+ # call_all callees.reverse
53
+ #
54
+ # # call
55
+ # dep.block.call if dep.block
56
+ #
57
+ # # after
58
+ # dep_lists = [dep.after]
59
+ # while !dep_lists.empty?
60
+ # call_all dep_lists
61
+ #
62
+ # dep_lists = next_level dep_lists, :after
63
+ # end
64
+ # end
65
+ #
66
+ # protected
67
+ # def add_dependency dep, type, ref
68
+ # raise "Dependency '#{dep.name}' already defined!" if dependencies.include? dep.name
69
+ # dependencies[dep.name] = dep
70
+ #
71
+ # # add back reference
72
+ # if type
73
+ # catch :found do
74
+ # dep_lists = [dependencies.values]
75
+ # while !dep_lists.empty?
76
+ # dep_lists.each do |list|
77
+ # list.each do |d|
78
+ # if d.name == ref
79
+ # d.send(type) << dep
80
+ # throw :found
81
+ # end
82
+ # end
83
+ # end
84
+ #
85
+ # dep_lists = next_level dep_lists, type
86
+ # end
87
+ #
88
+ # raise "Dependency '#{ref}' referenced from '#{dep.name}' not found!"
89
+ # end
90
+ # end
91
+ # end
92
+ #
93
+ # def next_level dep_lists, type
94
+ # r = []
95
+ # dep_lists.each do |list|
96
+ # list.each do |d|
97
+ # r << d.send(type)
98
+ # end
99
+ # end
100
+ # r
101
+ # end
102
+ #
103
+ # def call_all list_of_lists
104
+ # list_of_lists.each{|list| list.each{|d| d.block.call if d.block}}
105
+ # end
106
+ # end
107
+ # end
@@ -0,0 +1,5 @@
1
+ module Crystal
2
+ class Environment
3
+ inject :logger => :logger, :config => :config
4
+ end
5
+ end
@@ -0,0 +1,42 @@
1
+ module Crystal
2
+ module FilesHelper
3
+ def directories
4
+ $LOAD_PATH
5
+ end
6
+
7
+ def file_exist? path
8
+ find_files(path).size > 0
9
+ end
10
+
11
+ # find_files
12
+ def find_files_without_cache fname, directories = nil
13
+ fname.must =~ /\//
14
+ directories ||= self.directories
15
+ files = directories.collect{|dir| "#{dir}#{fname}"}
16
+ files.select{|f| File.exist? f}
17
+ end
18
+ cache_method_with_params_in_production :find_files
19
+
20
+ def find_file fname
21
+ files = find_files(fname)
22
+ raise "File '#{fname}' not found!" if files.size == 0
23
+ raise "Found multiple files for '#{fname}'" if files.size > 1
24
+ files.first
25
+ end
26
+
27
+ def find_files_by_pattern_without_cache pattern, directories = nil
28
+ directories ||= self.directories
29
+ patterns = directories.to_a.collect{|d| "#{d}#{pattern}"}
30
+ Dir.glob patterns
31
+ end
32
+ alias_method :find_files_by_pattern, :find_files_by_pattern_without_cache
33
+
34
+ def find_file_by_pattern pattern
35
+ files = find_files_by_pattern(pattern)
36
+ raise "File '#{pattern}' not found!" if files.size == 0
37
+ raise "Found multiple files for '#{pattern}'" if files.size > 1
38
+ files.first
39
+ end
40
+ end
41
+ end
42
+
@@ -0,0 +1,21 @@
1
+ crystal.register :logger do
2
+ if defined?(SILENCE_LOGGER)
3
+ logger = Logger.new nil
4
+ else
5
+ config = crystal[:config]
6
+ if config and config.root? and File.exist?("#{config.root}/log")
7
+ logger = ActiveSupport::BufferedLogger.new crystal.config.log_path
8
+ logger.level = ActiveSupport::BufferedLogger.const_get config.log_level.to_s.upcase
9
+ logger.auto_flushing = false if crystal.config.production?
10
+ elsif config and config.test?
11
+ logger = Logger.new nil
12
+ elsif config
13
+ logger = Logger.new STDOUT
14
+ logger.warn "No log folder!"
15
+ else
16
+ logger = Logger.new STDOUT
17
+ logger.warn "Config not initialized!"
18
+ end
19
+ end
20
+ logger
21
+ end
@@ -0,0 +1,52 @@
1
+ # Environment prepares and assembles your app ($LOAD_PATH, plugins and config files)
2
+
3
+ #
4
+ # Support
5
+ #
6
+ require 'crystal/support'
7
+
8
+ # config
9
+ [
10
+ 'config',
11
+ ].each{|f| require "crystal/environment/#{f}"}
12
+
13
+ module Crystal
14
+ VERSION = '0.0.1'
15
+ end
16
+
17
+ # environment
18
+ [
19
+ 'logger',
20
+ 'environment',
21
+ 'files_helper'
22
+ ].each{|f| require "crystal/environment/#{f}"}
23
+ Crystal::Environment.inherit Crystal::FilesHelper
24
+
25
+
26
+ #
27
+ # Runtime initialization
28
+ #
29
+ crystal do
30
+ register :config do
31
+ config = Crystal::Config.new.set!(:root => $APP_DIR)
32
+ config.load_app_config!
33
+ config
34
+ end
35
+
36
+ register :environment do
37
+ Crystal::Environment.new
38
+ end
39
+ end
40
+
41
+ #
42
+ # Handy mehtods
43
+ #
44
+ module Crystal
45
+ class << self
46
+ inject(
47
+ :config => :config,
48
+ :environment => :environment,
49
+ :logger => :logger
50
+ )
51
+ end
52
+ end
@@ -0,0 +1,52 @@
1
+ module Crystal
2
+ module ControllerUrlHelper
3
+ #
4
+ # redirect_to
5
+ #
6
+ def redirect_to *args
7
+ params, response = workspace.params, workspace.response
8
+ params.format.must_be.in 'html', 'js'
9
+
10
+ url = special_url(*args) || url_for(*args)
11
+
12
+ if params.format == 'js'
13
+ response.body << "window.location = '#{url}';"
14
+ else
15
+ response.status = 301
16
+ response.headers['Location'] = url
17
+ response.body = %(<html><body>You are being <a href="#{h(url)}">redirected</a>.</body></html>)
18
+ end
19
+
20
+ # Flash need to know if we using redirect
21
+ force_keeping_mode_for_flash!
22
+
23
+ nil
24
+ end
25
+
26
+ def reload_page
27
+ workspace.params.format.must == 'js'
28
+
29
+ force_keeping_mode_for_flash!
30
+ workspace.response.body << "window.location.reload();"
31
+ end
32
+
33
+ def special_url *args
34
+ return nil unless args.last.empty?
35
+
36
+ case args.first.to_s
37
+ when 'back'
38
+ workspace.request.env["HTTP_REFERER"] || 'javascript:history.back()'
39
+ when '#' then
40
+ '#'
41
+ else
42
+ nil
43
+ end
44
+ end
45
+
46
+ protected
47
+
48
+ def force_keeping_mode_for_flash!
49
+ crystal[:flash].force_keeping_mode! if crystal.include? :flash
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,5 @@
1
+ module Crystal
2
+ module FlashHelper
3
+ inject :flash => :flash
4
+ end
5
+ end
@@ -0,0 +1,40 @@
1
+ module Crystal
2
+ class Flash < OpenObject
3
+ attr_accessor :previous_messages, :current_messages
4
+
5
+ attr_accessor :ajax_mode, :force_keeping_mode
6
+
7
+ def initialize format, previous_messages = {}
8
+ self.current_messages, self.previous_messages = {}, previous_messages
9
+ self.ajax_mode = format == 'js'
10
+ self.force_keeping_mode = false
11
+ end
12
+
13
+ def [] key
14
+ key = key.to_s
15
+
16
+ if ajax_mode and !force_keeping_mode
17
+ current_messages[key] || previous_messages[key]
18
+ else
19
+ previous_messages[key]
20
+ end
21
+ end
22
+
23
+ def []= key, value
24
+ current_messages[key.to_s] = value.to_s
25
+ end
26
+
27
+ def force_keeping_mode!
28
+ self.force_keeping_mode = true
29
+ end
30
+
31
+ def messages_for_next_request
32
+ if ajax_mode and !force_keeping_mode
33
+ {}
34
+ else
35
+ current_messages
36
+ end
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,24 @@
1
+ require 'crystal/html'
2
+ require 'crystal/router'
3
+
4
+ module Crystal
5
+ # View helpers
6
+ [BasicHtmlHelper, FormHelper, JavascriptHelper, ViewUrlHelper].each do |helper|
7
+ ControllerContext.inherit helper
8
+ end
9
+
10
+ # Controller helpers
11
+ [RoutingHelper, FlashHelper, ControllerUrlHelper].each do |helper|
12
+ AbstractController.inherit helper
13
+ end
14
+
15
+ # TODO2 refactor it!
16
+ [
17
+ :special_url, :url_for, :persist_params, :dont_persist_params,
18
+ :default_path, :return_to_path,
19
+ :flash,
20
+ :redirect_to, :reload_page
21
+ ].each do |m|
22
+ ControllerContext.delegate m, :to => :controller
23
+ end
24
+ end
@@ -0,0 +1,26 @@
1
+ module Crystal
2
+ module Processors
3
+ class PrepareFlash < Processor
4
+
5
+ def call
6
+ workspace.request.must_be.present
7
+ workspace.params.must_be.defined
8
+
9
+ previous_messages = workspace.request.session.delete 'flash'
10
+ if previous_messages.present?
11
+ previous_messages = JSON.load previous_messages
12
+ crystal[:flash] = Crystal::Flash.new workspace.params.format, previous_messages
13
+ end
14
+
15
+ next_processor.call
16
+
17
+ if crystal.include? :flash
18
+ flash = crystal[:flash]
19
+ messages = flash.messages_for_next_request
20
+ workspace.request.must_be.present
21
+ workspace.request.session['flash'] = messages.to_json unless messages.empty?
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,30 @@
1
+ # Converts {'model[attribute]' => value} into {'model' => {'attribute' => value}}
2
+ module Crystal
3
+ module Processors
4
+ class ScopedParams < Processor
5
+ def call
6
+ if workspace.params?
7
+ to_delete = []
8
+ workspace.params.each do |name, value|
9
+ name.scan /(.+)\[(.+)\]/ do |scope_name, name_in_scope|
10
+ scope = workspace.params[scope_name] ||= {}
11
+
12
+ unless scope.is_a? Hash
13
+ logger.warn "Owerriding :#{scope} param!"
14
+ scope = {}
15
+ workspace.params[scope_name] = scope
16
+ end
17
+
18
+ scope[name_in_scope] = value
19
+ to_delete << name
20
+ end
21
+ end
22
+ to_delete.each{|n| workspace.params.delete n}
23
+ end
24
+
25
+ next_processor.call
26
+ end
27
+ end
28
+ end
29
+ end
30
+
@@ -0,0 +1,83 @@
1
+ module Crystal
2
+ module BasicHtmlHelper
3
+ BOOLEAN_ATTRIBUTES = %w(disabled readonly multiple checked autobuffer
4
+ autoplay controls loop selected hidden scoped async
5
+ defer reversed ismap seemless muted required
6
+ autofocus novalidate formnovalidate open).to_set
7
+ BOOLEAN_ATTRIBUTES.merge(BOOLEAN_ATTRIBUTES.map {|attr| attr.to_sym })
8
+
9
+
10
+ #
11
+ # authenticity_token
12
+ #
13
+ def authenticity_token; workspace.request.session['authenticity_token'] end
14
+
15
+
16
+ #
17
+ # JavaScript & StyleSheets
18
+ #
19
+ def stylesheet_link_tag *stylesheets
20
+ Array(stylesheets).collect{|ssheet|
21
+ tag :link, '', :href => "#{config && config.url_root!}#{ssheet}", :media => "screen", :rel => "stylesheet", :type => "text/css"
22
+ }.join("\n")
23
+ end
24
+
25
+
26
+ #
27
+ # Assets
28
+ #
29
+ def image_tag src, opt = {}
30
+ opt[:src] = src
31
+ tag :img, '', opt
32
+ end
33
+
34
+
35
+ #
36
+ # Common HTML tags
37
+ #
38
+ def label_tag name, text, options = {}
39
+ tag :label, text, options.merge(:for => name)
40
+ end
41
+
42
+
43
+ #
44
+ # Special
45
+ #
46
+ def tag name, content_or_options_with_block = nil, options = nil, escape = true, &block
47
+ if block_given?
48
+ options = content_or_options_with_block if content_or_options_with_block.is_a?(Hash)
49
+ content = capture(&block)
50
+ concat "<#{name}#{tag_options(options)}>#{content}</#{name}>"
51
+ else
52
+ content = content_or_options_with_block
53
+ "<#{name}#{tag_options(options)}>#{content}</#{name}>"
54
+ end
55
+ end
56
+
57
+ # instance_methods(false).each do |m|
58
+ # alias_method "html_#{m}", m
59
+ # end
60
+
61
+ # Escape
62
+ def h obj; obj.to_s.html_escape end
63
+
64
+ protected
65
+
66
+ def tag_options options
67
+ return "" unless options
68
+ options.must_be.a Hash
69
+ unless options.blank?
70
+ attrs = []
71
+ options.each_pair do |key, value|
72
+ if BOOLEAN_ATTRIBUTES.include?(key)
73
+ attrs << %(#{key}="#{key}") if value
74
+ elsif !value.nil?
75
+ final_value = value.is_a?(Array) ? value.join(" ") : value
76
+ attrs << %(#{key}="#{final_value}")
77
+ end
78
+ end
79
+ " #{attrs.sort * ' '}" unless attrs.empty?
80
+ end
81
+ end
82
+ end
83
+ end