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,41 @@
1
+ require 'rspec_ext'
2
+
3
+ RSpec::Core::ExampleGroup.class_eval do
4
+ def self.swap_metadata
5
+ old_metadata = nil
6
+
7
+ before :all do
8
+ old_metadata = Micon.metadata
9
+ Micon.swap_metadata old_metadata.deep_clone
10
+ end
11
+
12
+ after :all do
13
+ Micon.swap_metadata old_metadata
14
+ end
15
+ end
16
+
17
+ def self.with_environment environment = :test
18
+ swap_metadata
19
+
20
+ before :each do
21
+ crystal.clear
22
+ crystal[:config].environment = environment
23
+ end
24
+
25
+ after :each do
26
+ crystal.clear
27
+ end
28
+ end
29
+
30
+ inject(
31
+ :config => :config,
32
+ :logger => :logger
33
+ )
34
+
35
+ def silence_logger!
36
+ self.logger = Logger.new nil
37
+ end
38
+ end
39
+
40
+ # Spec::Runner.configure do |config|
41
+ # end
@@ -0,0 +1,67 @@
1
+ module Crystal
2
+ module RSpecHelper
3
+ attr_accessor :response, :workspace
4
+ end
5
+ end
6
+
7
+ Crystal::Response.class_eval do
8
+ inject :workspace => :workspace
9
+ attr_accessor :rson
10
+ end
11
+
12
+ RSpec::Core::ExampleGroup.class_eval do
13
+ def self.with_http
14
+ RSpec::Core::ExampleGroup.include Crystal::RSpecHelper
15
+
16
+ before :each do
17
+ self.response = nil
18
+ end
19
+
20
+ before :all do
21
+ crystal.before_scope :cycle do
22
+ if defined?(Crystal::Processors) and defined?(Crystal::Processors::PrepareParams)
23
+ crystal.conveyors.web do |web|
24
+ web.definitions.delete_if{|pdef, args| pdef == Crystal::Processors::PrepareParams}
25
+ web.build!
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ def wcall *args, &block
33
+ # parsing arguments
34
+ params = args.extract_options!
35
+
36
+ workspace_variables = {}
37
+ if args.size == 1 and args.first.is_a?(String)
38
+ workspace_variables[:path] = args.first
39
+ elsif args.first.is_a?(Class) and args.size >= 2
40
+ workspace_variables[:path] = '/'
41
+ workspace_variables[:class] = args[0]
42
+ workspace_variables[:method_name] = args[1].to_s
43
+ if args.size > 2
44
+ workspace_variables.merge! args[2].symbolize_keys
45
+ end
46
+ else
47
+ raise "Invalid input!"
48
+ end
49
+
50
+ # calling
51
+ self.response = Crystal::Response.new
52
+ workspace_variables.merge!({
53
+ :request => Crystal::Request.new(workspace_variables[:env] || {}),
54
+ :params => Crystal::Params.new(params),
55
+ :response => response,
56
+ })
57
+
58
+ workspace = crystal.conveyors.web.call(workspace_variables, &block)
59
+
60
+ workspace.response.must_be.defined
61
+ self.response = workspace.response
62
+ self.response.rson = workspace.remote_result
63
+ self.workspace = workspace
64
+
65
+ response
66
+ end
67
+ end
@@ -0,0 +1,20 @@
1
+ raise 'not finished'
2
+
3
+ #
4
+ # Mail
5
+ #
6
+ RSpec::Core::ExampleGroup.class_eval do
7
+ def self.with_mail
8
+ raise 'not implemented'
9
+ end
10
+
11
+ def clear_mail
12
+ # ActionMailer::Base.delivery_method = :test
13
+ # ActionMailer::Base.perform_deliveries = true
14
+ # ActionMailer::Base.deliveries = []
15
+ end
16
+
17
+ def sent_letters
18
+ # ActionMailer::Base.deliveries
19
+ end
20
+ end
@@ -0,0 +1,9 @@
1
+ require 'crystal/spec/environment'
2
+
3
+ RSpec::Core::ExampleGroup.class_eval do
4
+ def rcall klass, method, params = {}
5
+ crystal.conveyors.services.call(
6
+ :class => klass, :method_name => method.to_s, :params => Crystal::Params.new(params)
7
+ )
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ raise 'not finished'
2
+
3
+ #
4
+ # Routes
5
+ #
6
+ RSpec::Core::ExampleGroup.class_eval do
7
+ def default_path
8
+ crystal.config.default_path!
9
+ end
10
+ end
@@ -0,0 +1,33 @@
1
+ class String
2
+ def to_xhtml css = nil
3
+ node = Nokogiri::HTML(self)
4
+ unless css
5
+ node
6
+ else
7
+ nodes = node.css(css)
8
+ raise "Elements for '#{css}' CSS query not found!" if nodes.size < 1
9
+ raise "Found more than one elment for '#{css}' CSS query!" if nodes.size > 1
10
+ nodes.first
11
+ end
12
+ end
13
+ end
14
+
15
+ ::Nokogiri::XML::Node.class_eval do
16
+ def should_be_equal_to attributes
17
+ attributes.stringify_keys!
18
+ node_attributes = {}
19
+
20
+ attributes.each do |k, v|
21
+ nv = if k == 'content'
22
+ self.content
23
+ else
24
+ self[k]
25
+ end
26
+ node_attributes[k] = nv
27
+ end
28
+
29
+ node_attributes.should == attributes
30
+ end
31
+
32
+
33
+ end
@@ -0,0 +1,8 @@
1
+ require 'rspec_ext'
2
+
3
+ %w(
4
+ controller
5
+ environment
6
+ http
7
+ remote
8
+ ).each{|f| require "crystal/spec/#{f}"}
@@ -0,0 +1,2 @@
1
+ # default time
2
+ Time::DATE_FORMATS[:default] = "%Y-%m-%d %H:%M:%S"
@@ -1,30 +1,39 @@
1
- gem 'activesupport' #, '= 2.3.5'
1
+ require 'active_support/all'
2
2
 
3
- # autoload :BacktraceCleaner, 'active_support/backtrace_cleaner'
4
- autoload :Base64, 'active_support/base64'
5
- autoload :BasicObject, 'active_support/basic_object'
6
- # autoload :BufferedLogger, 'active_support/buffered_logger'
7
- # autoload :Cache, 'active_support/cache'
8
- # autoload :Callbacks, 'active_support/callbacks'
9
- # autoload :Deprecation, 'active_support/deprecation'
10
- # autoload :Duration, 'active_support/duration'
11
- # autoload :Gzip, 'active_support/gzip'
12
- autoload :Inflector, 'active_support/inflector'
13
- # autoload :Memoizable, 'active_support/memoizable'
14
- # autoload :MessageEncryptor, 'active_support/message_encryptor'
15
- # autoload :MessageVerifier, 'active_support/message_verifier'
16
- # autoload :Multibyte, 'active_support/multibyte'
17
- # autoload :OptionMerger, 'active_support/option_merger'
18
- # autoload :OrderedHash, 'active_support/ordered_hash'
19
- # autoload :OrderedOptions, 'active_support/ordered_options'
20
- # autoload :Rescuable, 'active_support/rescuable'
21
- # autoload :SecureRandom, 'active_support/secure_random'
22
- # autoload :StringInquirer, 'active_support/string_inquirer'
23
- autoload :TimeWithZone, 'active_support/time_with_zone'
24
- autoload :TimeZone, 'active_support/values/time_zone'
25
- # autoload :XmlMini, 'active_support/xml_mini'
3
+ # gem 'activesupport' #, '= 2.3.5'
4
+ #
5
+ # # autoload :BacktraceCleaner, 'active_support/backtrace_cleaner'
6
+ # autoload :Base64, 'active_support/base64'
7
+ # # autoload :BasicObject, 'active_support/basic_object' we use our own implementation
8
+ #
9
+ # # autoload :BufferedLogger, 'active_support/buffered_logger'
10
+ # # autoload :Cache, 'active_support/cache'
11
+ # # autoload :Callbacks, 'active_support/callbacks'
12
+ # # autoload :Deprecation, 'active_support/deprecation'
13
+ # # autoload :Duration, 'active_support/duration'
14
+ # # autoload :Gzip, 'active_support/gzip'
15
+ # autoload :Inflector, 'active_support/inflector'
16
+ # # autoload :Memoizable, 'active_support/memoizable'
17
+ # # autoload :MessageEncryptor, 'active_support/message_encryptor'
18
+ # # autoload :MessageVerifier, 'active_support/message_verifier'
19
+ # # autoload :Multibyte, 'active_support/multibyte'
20
+ # # autoload :OptionMerger, 'active_support/option_merger'
21
+ # # autoload :OrderedHash, 'active_support/ordered_hash'
22
+ # # autoload :OrderedOptions, 'active_support/ordered_options'
23
+ # # autoload :Rescuable, 'active_support/rescuable'
24
+ # # autoload :SecureRandom, 'active_support/secure_random'
25
+ # # autoload :StringInquirer, 'active_support/string_inquirer'
26
+ # autoload :TimeWithZone, 'active_support/time_with_zone'
27
+ # autoload :TimeZone, 'active_support/values/time_zone'
28
+ # # autoload :XmlMini, 'active_support/xml_mini'
29
+ #
30
+ # # require 'active_support/vendor'
31
+ # require 'active_support/core_ext'
32
+ # # require 'active_support/dependencies'
33
+ # # require 'active_support/json'
26
34
 
27
- # require 'active_support/vendor'
28
- require 'active_support/core_ext'
29
- # require 'active_support/dependencies'
30
- require 'active_support/json'
35
+
36
+ #
37
+ # Hacks
38
+ #
39
+ require 'crystal/support/active_support/micelaneous'
@@ -0,0 +1,45 @@
1
+ Addressable::URI.class_eval do
2
+ def request_uri
3
+ return nil if self.absolute? && self.scheme !~ /^https?$/
4
+ return (
5
+ (self.path != "" ? self.path : "/") +
6
+ (self.query ? "?#{self.query}" : "")
7
+ )
8
+ end
9
+
10
+ def self.normalize_host host
11
+ host.gsub(/^www\./, "")
12
+ end
13
+
14
+ def normalized_host
15
+ host ? host : host.gsub(/^www\./, '')
16
+ end
17
+
18
+ # Delete 'nil' keys
19
+ def query_values_with_skip_nil= options
20
+ to_delete = []
21
+ options.each{|k, v| to_delete << k if v.nil?}
22
+ to_delete.each{|k| options.delete k}
23
+
24
+ self.query_values_without_skip_nil = options
25
+ end
26
+ alias_method_chain :query_values=, :skip_nil
27
+
28
+
29
+ # Override original to fix:
30
+ # - extra '?' sign (/some_path?) if there's empty but not-nil query
31
+ def to_s
32
+ @uri_string ||= (begin
33
+ uri_string = ""
34
+ uri_string << "#{self.scheme}:" if self.scheme != nil
35
+ uri_string << "//#{self.authority}" if self.authority != nil
36
+ uri_string << self.path.to_s
37
+ uri_string << "?#{self.query}" unless self.query.blank?
38
+ uri_string << "##{self.fragment}" if self.fragment != nil
39
+ if uri_string.respond_to?(:force_encoding)
40
+ uri_string.force_encoding(Encoding::UTF_8)
41
+ end
42
+ uri_string
43
+ end)
44
+ end
45
+ end
@@ -0,0 +1,38 @@
1
+ #
2
+ # In development mode log also to STDOUT
3
+ #
4
+ ActiveSupport::BufferedLogger.class_eval do
5
+ def flush_with_stdout
6
+ STDOUT.write(buffer.join) if crystal.include?(:config) and crystal[:config].development? and !buffer.empty?
7
+ flush_without_stdout
8
+ end
9
+ alias_method_chain :flush, :stdout
10
+
11
+ def info_with_format obj
12
+ info_without_format(obj_to_string(obj))
13
+ end
14
+ alias_method_chain :info, :format
15
+
16
+ def warn_with_format obj
17
+ warn_without_format("WARN: " + obj_to_string(obj))
18
+ end
19
+ alias_method_chain :warn, :format
20
+
21
+ def error_with_format obj
22
+ error_without_format("ERROR: " + obj_to_string(obj))
23
+ end
24
+ alias_method_chain :error, :format
25
+
26
+ protected
27
+ def obj_to_string obj
28
+ if obj.is_a? Exception
29
+ backtrace = (obj.backtrace && obj.backtrace.sfilter(Exception.common_filters)) || []
30
+ %{\
31
+ #{obj.message}
32
+ #{backtrace.join("\n ")}
33
+ }
34
+ else
35
+ obj.to_s
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,155 @@
1
+ module Crystal
2
+ module Callbacks
3
+ class AbstractCallback
4
+ attr_accessor :executor, :conditions, :terminator
5
+
6
+ def terminate? target, result
7
+ unless terminator.nil?
8
+ if terminator.is_a? Proc
9
+ terminator.call target, result
10
+ else
11
+ result == terminator
12
+ end
13
+ else
14
+ false
15
+ end
16
+ end
17
+
18
+ def run? target, inf
19
+ if cond = conditions[:if]
20
+ evaluate_if(cond, target, inf)
21
+ elsif cond = conditions[:unless]
22
+ !evaluate_if(cond, target, inf)
23
+ elsif cond = conditions[:only]
24
+ evaluate_only(cond, inf)
25
+ elsif cond = conditions[:except]
26
+ !evaluate_only(cond, inf)
27
+ else
28
+ true
29
+ end
30
+ end
31
+
32
+ def add_to_chain target, inf, &the_next
33
+ if run? target, inf
34
+ build_block target, &the_next
35
+ else
36
+ the_next
37
+ end
38
+ end
39
+
40
+ alias_method :deep_clone, :clone
41
+
42
+ protected
43
+ def evaluate_if cond, target, inf
44
+ if cond.string_or_symbol?
45
+ target.send cond
46
+ elsif cond.is_a? Proc
47
+ cond.call target, inf
48
+ else
49
+ must_be.never_called
50
+ end
51
+ end
52
+
53
+ def evaluate_only cond, inf
54
+ method = inf[:method].to_s
55
+ if cond.string_or_symbol?
56
+ cond.to_s == method.to_s
57
+ elsif cond.is_a? Array
58
+ cond.include? method.to_s
59
+ end
60
+ end
61
+ end
62
+
63
+ class BeforeCallback < AbstractCallback
64
+ def build_block target, &the_next
65
+ lambda do
66
+ result = if executor.string_or_symbol?
67
+ target.send executor
68
+ elsif executor.is_a? Proc
69
+ executor.call target
70
+ else
71
+ must_be.never_called
72
+ end
73
+
74
+ the_next.call unless terminate? target, result
75
+ end
76
+ end
77
+ end
78
+
79
+ class AroundCallback < AbstractCallback
80
+ def build_block target, &the_next
81
+ lambda do
82
+ if executor.string_or_symbol?
83
+ target.send executor, &the_next
84
+ elsif executor.is_a? Proc
85
+ executor.call target, the_next
86
+ else
87
+ must_be.never_called
88
+ end
89
+ end
90
+ end
91
+ end
92
+
93
+ class AfterCallback < AbstractCallback
94
+ def build_block target, &the_next
95
+ lambda do
96
+ result = if executor.string_or_symbol?
97
+ target.send executor
98
+ elsif executor.is_a? Proc
99
+ executor.call target
100
+ else
101
+ must_be.never_called
102
+ end
103
+
104
+ the_next.call unless terminate? target, result
105
+ end
106
+ end
107
+ end
108
+
109
+ def run_callbacks callback_name, additional_information = {}, &block
110
+ callback_name = callback_name.to_s
111
+ block.must_be.defined
112
+
113
+ callbacks = self.class.callbacks[callback_name]
114
+ chain_head = block
115
+ if callbacks and !callbacks.empty?
116
+ callbacks.reverse_each do |callback|
117
+ block = callback.add_to_chain self, additional_information, &chain_head
118
+ chain_head = block if block
119
+ end
120
+ end
121
+ chain_head.call
122
+ end
123
+
124
+ module ClassMethods
125
+ inheritable_accessor :callbacks, {}
126
+
127
+ def set_callback callback_name, type, *executor_or_options, &block
128
+ # parsing arguments
129
+ type, callback_name = type.to_s, callback_name.to_s
130
+ opt = executor_or_options.extract_options!
131
+ opt = opt.symbolize_keys
132
+ "You can't provide both method name and block for filter!" if block and !executor_or_options.empty?
133
+ executor = block || executor_or_options.first
134
+
135
+ type.must_be.in %w{before around after}
136
+ executor.must_be.defined
137
+
138
+ # creating callback
139
+ callback = case type
140
+ when 'before' then BeforeCallback.new
141
+ when 'around' then AroundCallback.new
142
+ when 'after' then AfterCallback.new
143
+ end
144
+
145
+ callback.executor = executor
146
+ callback.terminator = opt.delete :terminator
147
+ callback.conditions = opt
148
+
149
+ callbacks[callback_name] ||= []
150
+ callbacks[callback_name] << callback
151
+ end
152
+
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,21 @@
1
+ class Exception
2
+ class << self
3
+ attr_accessor :common_filters
4
+ end
5
+ end
6
+ Exception.common_filters = [
7
+ "/gems/haml",
8
+ "/gems/tilt",
9
+ "/gems/facets",
10
+ "/gems/rack",
11
+ "/gems/mongrel",
12
+ "/gems/rspec",
13
+ "/timeout.rb",
14
+ "/bin/spec",
15
+
16
+ "/monitor",
17
+ "/synchronize",
18
+ "/class_loader",
19
+ "/micon"
20
+ ]
21
+ # Exception.common_filters = []
@@ -0,0 +1,34 @@
1
+ module Crystal
2
+ module Filters
3
+ inherit Callbacks
4
+
5
+ module ClassMethods
6
+ def before *args, &block
7
+ opt = args.extract_options!
8
+ if block
9
+ set_callback :action, :before, opt, &block
10
+ else
11
+ args.each{|executor| set_callback :action, :before, executor, opt}
12
+ end
13
+ end
14
+
15
+ def around *args, &block
16
+ opt = args.extract_options!
17
+ if block
18
+ set_callback :action, :around, opt, &block
19
+ else
20
+ args.each{|executor| set_callback :action, :around, executor, opt}
21
+ end
22
+ end
23
+
24
+ def after *args, &block
25
+ opt = args.extract_options!
26
+ if block
27
+ set_callback :action, :after, opt, &block
28
+ else
29
+ args.each{|executor| set_callback :action, :after, executor, opt}
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,9 @@
1
+ module Crystal
2
+ class Format < String
3
+ def method_missing m
4
+ m = m.to_s
5
+ super unless m[-1..-1] == '?'
6
+ self == m[0..-2]
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,12 @@
1
+ gem 'activesupport', '>= 3.0.0'
2
+
3
+ gem 'haml'
4
+ gem 'tilt'
5
+ gem 'facets'
6
+ gem 'dictionary'
7
+ gem 'json'
8
+ gem 'addressable'
9
+ gem 'nokogiri'
10
+
11
+ gem 'rack', '>= 1.1'
12
+ # gem 'ruby-ext'
@@ -0,0 +1,16 @@
1
+ module Crystal
2
+ class << self
3
+ delegate :register, :[], :[]=, :before, :after, :before_scope, :after_scope, :activate, :include?, :clear, :to => Micon
4
+ end
5
+ end
6
+
7
+ def crystal &block
8
+
9
+
10
+
11
+ if block
12
+ Crystal.class_eval &block
13
+ else
14
+ Crystal
15
+ end
16
+ end
@@ -0,0 +1,11 @@
1
+ module Mime
2
+ class << self
3
+ def method_missing m
4
+ self[m]
5
+ end
6
+
7
+ def [] type
8
+ Rack::Mime.mime_type(".#{type}") || raise("Unknown MIME type: #{type}")
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,44 @@
1
+ class Module
2
+
3
+ #
4
+ # Dynamically enables cache in :production and disables in another environments.
5
+ # If no environment given uses non-cached version.
6
+ #
7
+ def cache_method_with_params_in_production method
8
+ method_with_cache, method_without_cache = "#{method}_with_cache", "#{method}_without_cache"
9
+ iv = "@#{method}_cache"
10
+
11
+ raise "Method '#{method}' already defined!" if instance_methods.include?(method)
12
+ raise "Can't cache the '#{method}' twice!" if instance_methods.include?(method_with_cache)
13
+
14
+ # create cached method
15
+ define_method method_with_cache do |*args|
16
+ unless results = instance_variable_get(iv)
17
+ results = Hash.new(NotDefined)
18
+ instance_variable_set iv, results
19
+ end
20
+
21
+ result = results[args]
22
+
23
+ if result.equal? NotDefined
24
+ result = send als, *args
25
+ results[args] = result
26
+ end
27
+
28
+ result
29
+ end
30
+
31
+ # listen to environment events
32
+ crystal.after :config do |config|
33
+ if config.production?
34
+ alias_method method, method_with_cache
35
+ else
36
+ alias_method method, method_without_cache
37
+ end
38
+ end
39
+
40
+ # by default uses non-cached version
41
+ alias_method method, method_without_cache
42
+ end
43
+
44
+ end