rad_core 0.0.13 → 0.0.14

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 (330) hide show
  1. data/Rakefile +4 -3
  2. data/lib/components/config.rb +6 -0
  3. data/lib/components/controller.rb +5 -0
  4. data/lib/components/controller.yml +3 -0
  5. data/lib/components/conveyors.rb +7 -0
  6. data/lib/components/environment.rb +5 -0
  7. data/lib/components/environment.yml +3 -0
  8. data/lib/components/flash.rb +5 -0
  9. data/lib/components/html.rb +4 -0
  10. data/lib/components/html.yml +3 -0
  11. data/lib/components/http.rb +6 -0
  12. data/lib/components/http.yml +13 -0
  13. data/lib/components/logger.rb +5 -0
  14. data/lib/components/mailer.rb +9 -0
  15. data/lib/components/remote.rb +4 -0
  16. data/lib/components/router.rb +13 -0
  17. data/lib/components/router.yml +2 -0
  18. data/lib/components/template.rb +8 -0
  19. data/lib/components/template.yml +1 -0
  20. data/lib/components/web.rb +8 -0
  21. data/lib/components/workspace.rb +1 -0
  22. data/lib/rad/{support → _support}/active_support/locales/en/actionpack.yml +0 -0
  23. data/lib/rad/{support → _support}/active_support/locales/en/activesupport.yml +0 -0
  24. data/lib/rad/_support/active_support/locales/ru/actionview.yml +162 -0
  25. data/lib/rad/_support/active_support/locales/ru/activesupport.yml +16 -0
  26. data/lib/rad/_support/active_support/locales/ru/datetime.yml +49 -0
  27. data/lib/rad/{support → _support}/active_support/micelaneous.rb +0 -0
  28. data/lib/rad/{support → _support}/active_support/time.rb +0 -0
  29. data/lib/rad/{support → _support}/active_support.rb +14 -2
  30. data/lib/rad/{support → _support}/addressable.rb +0 -0
  31. data/lib/rad/_support/callbacks.rb +166 -0
  32. data/lib/rad/_support/class_loader.rb +9 -0
  33. data/lib/rad/_support/encoding.rb +3 -0
  34. data/lib/rad/_support/exception.rb +45 -0
  35. data/lib/rad/_support/extensions.rb +20 -0
  36. data/lib/rad/_support/filters.rb +32 -0
  37. data/lib/rad/{support → _support}/hacks_and_fixes.rb +0 -0
  38. data/lib/rad/{support → _support}/mime.rb +6 -0
  39. data/lib/rad/{support → _support}/module.rb +7 -9
  40. data/lib/rad/_support/require.rb +62 -0
  41. data/lib/rad/{support → _support}/rson.rb +0 -0
  42. data/lib/rad/{support → _support}/ruby_ext_with_active_support.rb +0 -0
  43. data/lib/rad/{support → _support}/string.rb +9 -1
  44. data/lib/rad/controller/_abstract/micelaneous.rb +27 -0
  45. data/lib/rad/controller/_abstract/render.rb +159 -0
  46. data/lib/rad/controller/_abstract/responder.rb +13 -0
  47. data/lib/rad/controller/_abstract.rb +37 -0
  48. data/lib/rad/controller/_context.rb +15 -0
  49. data/lib/rad/controller/_http.rb +50 -0
  50. data/lib/rad/controller/_require.rb +19 -0
  51. data/lib/rad/controller/abstract.rb +1 -0
  52. data/lib/rad/controller/context.rb +1 -0
  53. data/lib/rad/controller/http.rb +1 -0
  54. data/lib/rad/controller/processors/controller_caller.rb +22 -24
  55. data/lib/rad/controller/processors/controller_error_handling.rb +46 -48
  56. data/lib/rad/controller/processors/controller_logger.rb +7 -9
  57. data/lib/rad/controller.rb +1 -28
  58. data/lib/rad/conveyors/_conveyor.rb +73 -0
  59. data/lib/rad/conveyors/_conveyors.rb +19 -0
  60. data/lib/rad/conveyors/_params.rb +10 -0
  61. data/lib/rad/conveyors/_processor.rb +13 -0
  62. data/lib/rad/conveyors/_require.rb +10 -0
  63. data/lib/rad/conveyors/_workspace.rb +34 -0
  64. data/lib/rad/conveyors/params.rb +1 -0
  65. data/lib/rad/conveyors/processor.rb +1 -0
  66. data/lib/rad/conveyors/processors/conveyor_logger.rb +23 -0
  67. data/lib/rad/conveyors/workspace.rb +1 -0
  68. data/lib/rad/conveyors.rb +1 -0
  69. data/lib/rad/core_web/_controller_micelaneous_helper.rb +17 -0
  70. data/lib/rad/core_web/_require.rb +25 -0
  71. data/lib/rad/core_web/_router/abstract_routing_helper.rb +20 -0
  72. data/lib/rad/core_web/_router/controller_routing_helper.rb +56 -0
  73. data/lib/rad/core_web/_router/view_routing_helper.rb +57 -0
  74. data/lib/rad/environment/_config.rb +27 -0
  75. data/lib/rad/environment/_environment.rb +17 -0
  76. data/lib/rad/environment/_files_helper.rb +55 -0
  77. data/lib/rad/environment/_logger.rb +53 -0
  78. data/lib/rad/environment/_require.rb +24 -0
  79. data/lib/rad/environment/config.rb +1 -111
  80. data/lib/rad/environment.rb +1 -55
  81. data/lib/{rad_core → rad}/gems.rb +2 -3
  82. data/lib/rad/html/_flash.rb +40 -0
  83. data/lib/rad/html/_helpers/basic_html_helper.rb +72 -0
  84. data/lib/rad/html/_helpers/flash_helper.rb +3 -0
  85. data/lib/rad/html/_helpers/form_helper.rb +114 -0
  86. data/lib/rad/html/_helpers/html_helper.rb +3 -0
  87. data/lib/rad/html/_helpers/javascript_helper.rb +27 -0
  88. data/lib/rad/html/_helpers/model_helper.rb +143 -0
  89. data/lib/rad/html/_require.rb +15 -0
  90. data/lib/rad/html/processors/prepare_flash.rb +22 -23
  91. data/lib/rad/html/processors/scoped_params.rb +18 -21
  92. data/lib/rad/html.rb +1 -26
  93. data/lib/rad/http/_http.rb +11 -0
  94. data/lib/rad/http/_http_adapter.rb +44 -0
  95. data/lib/rad/http/_request.rb +50 -0
  96. data/lib/rad/http/_require.rb +33 -0
  97. data/lib/rad/http/_response.rb +84 -0
  98. data/lib/rad/http/{support → _support}/rack/fixes.rb +0 -0
  99. data/lib/rad/http/_support/rack/rack_adapter.rb +57 -0
  100. data/lib/rad/http/processors/evaluate_format.rb +16 -19
  101. data/lib/rad/http/processors/http_logger.rb +10 -12
  102. data/lib/rad/http/processors/http_writer.rb +24 -26
  103. data/lib/rad/http/processors/prepare_params.rb +19 -18
  104. data/lib/rad/http/request.rb +1 -0
  105. data/lib/rad/http/response.rb +1 -0
  106. data/lib/rad/http.rb +1 -48
  107. data/lib/rad/mailer/_letter.rb +28 -0
  108. data/lib/rad/mailer/_mailer.rb +13 -0
  109. data/lib/rad/mailer/_mailer_controller.rb +38 -0
  110. data/lib/rad/mailer/_require.rb +7 -0
  111. data/lib/rad/mailer/mailer_controller.rb +1 -0
  112. data/lib/rad/mailer/processors/letter_builder.rb +34 -0
  113. data/lib/rad/mailer.rb +1 -0
  114. data/lib/rad/profiles/mailer.rb +5 -0
  115. data/lib/rad/profiles/web.rb +29 -52
  116. data/lib/rad/remote/_remote_controller.rb +9 -0
  117. data/lib/rad/remote/_require.rb +6 -0
  118. data/lib/rad/remote/processors/remote_caller.rb +44 -46
  119. data/lib/rad/remote/processors/remote_logger.rb +8 -10
  120. data/lib/rad/remote/remote_controller.rb +1 -0
  121. data/lib/rad/remote.rb +1 -9
  122. data/lib/rad/router/_abstract_router.rb +50 -0
  123. data/lib/rad/router/_alias_router.rb +124 -0
  124. data/lib/rad/router/_basic_router.rb +72 -0
  125. data/lib/rad/router/_configurator.rb +19 -0
  126. data/lib/rad/router/_core_routing_helper.rb +39 -0
  127. data/lib/rad/router/_default_format_processor.rb +10 -0
  128. data/lib/rad/router/_object_router.rb +184 -0
  129. data/lib/rad/router/_require.rb +31 -0
  130. data/lib/rad/router/_restful_router.rb +124 -0
  131. data/lib/rad/router/_router.rb +294 -0
  132. data/lib/rad/router/_simple_router.rb +21 -0
  133. data/lib/rad/router/abstract_router.rb +1 -0
  134. data/lib/rad/router/alias_router.rb +1 -0
  135. data/lib/rad/router/configurator.rb +1 -0
  136. data/lib/rad/router/micelaneous_router.rb +1 -0
  137. data/lib/rad/router/object_router.rb +1 -0
  138. data/lib/rad/router/processors/router.rb +23 -0
  139. data/lib/rad/router/restful_router.rb +1 -0
  140. data/lib/rad/{html/include_into_controller.rb → router/simple_router.rb} +0 -0
  141. data/lib/rad/router.rb +1 -29
  142. data/lib/rad/spec/controller.rb +20 -11
  143. data/lib/rad/spec/environment.rb +22 -38
  144. data/lib/rad/spec/http.rb +13 -86
  145. data/lib/rad/spec/http_controller.rb +105 -0
  146. data/lib/rad/spec/mailer.rb +27 -0
  147. data/lib/rad/spec/remote.rb +2 -2
  148. data/lib/rad/spec/router.rb +9 -11
  149. data/lib/rad/spec/template.rb +8 -2
  150. data/lib/rad/spec/xhtml.rb +0 -2
  151. data/lib/rad/spec.rb +4 -2
  152. data/lib/rad/template/_context.rb +92 -0
  153. data/lib/rad/template/_relative_path_resolver.rb +8 -0
  154. data/lib/rad/template/_require.rb +15 -0
  155. data/lib/rad/template/{support → _support}/tilt.rb +0 -0
  156. data/lib/rad/template/{support → _support}/tilt_fixes.rb +0 -0
  157. data/lib/rad/template/_template.rb +175 -0
  158. data/lib/rad/template/template_context.rb +1 -62
  159. data/lib/rad/template.rb +1 -25
  160. data/lib/rad.rb +8 -0
  161. data/readme.md +40 -12
  162. data/spec/controller/{abstract_controller_spec → abstract_spec}/views/OperationsOrderSpec/action.erb +0 -0
  163. data/spec/controller/{abstract_controller_spec → abstract_spec}/views/ViewVariablesSpec/action.erb +0 -0
  164. data/spec/controller/abstract_spec.rb +126 -0
  165. data/spec/controller/{controller_context_spec/views/ItemSpec → context_spec/views/NamespaceSpec/ClassSpec}/show.erb +0 -0
  166. data/spec/controller/{controller_context_spec/views/ItemSpec → context_spec/views/item_spec}/actions.erb +0 -0
  167. data/spec/controller/{controller_context_spec/views/NamespaceSpec/ClassSpec → context_spec/views/item_spec}/show.erb +0 -0
  168. data/spec/controller/{controller_context_spec/views/ItemSpec → context_spec/views/item_spec}/update.erb +0 -0
  169. data/spec/controller/{controller_context_spec → context_spec}/views/namespace_spec/class_spec/update.erb +0 -0
  170. data/spec/controller/{controller_context_spec/views/PageSpec → context_spec/views/page_spec}/actions.erb +0 -0
  171. data/spec/controller/{controller_context_spec/views/PageSpec → context_spec/views/page_spec}/show.erb +0 -0
  172. data/spec/controller/context_spec.rb +123 -0
  173. data/spec/controller/error_handling_spec.rb +21 -27
  174. data/spec/controller/{controller_helper_spec → helper_spec}/views/HelperMethodSpec/action.erb +0 -0
  175. data/spec/controller/{controller_helper_spec → helper_spec}/views/HelperSpec/action.erb +0 -0
  176. data/spec/controller/{controller_helper_spec.rb → helper_spec.rb} +7 -13
  177. data/spec/controller/{http_controller_spec.rb → http_spec.rb} +17 -23
  178. data/spec/controller/{controller_render_spec/views/AlreadyRenderedSpec → render_spec/views/already_rendered_spec}/action.erb +0 -0
  179. data/spec/controller/{controller_render_spec/views/AlreadyRenderedSpec → render_spec/views/already_rendered_spec}/custom_template.erb +0 -0
  180. data/spec/controller/{controller_render_spec/views/AnotherActionSpec → render_spec/views/another_action_spec}/another_action.erb +0 -0
  181. data/spec/controller/{controller_render_spec/views/AnotherLayout → render_spec/views/another_layout}/action.erb +0 -0
  182. data/spec/controller/{controller_render_spec/views/ForbidPartialAsActionSpec → render_spec/views/forbid_partial_as_action_spec}/_action.erb +0 -0
  183. data/spec/controller/{controller_render_spec/views/FormatSpec → render_spec/views/format_spec}/action.html.erb +0 -0
  184. data/spec/controller/{controller_render_spec/views/FormatSpec → render_spec/views/format_spec}/action.js.erb +0 -0
  185. data/spec/controller/{controller_render_spec/views/LayoutFiltersSpec → render_spec/views/layout_filters_spec}/action_with_layout.erb +0 -0
  186. data/spec/controller/{controller_render_spec/views/LayoutFiltersSpec → render_spec/views/layout_filters_spec}/action_without_layout.erb +0 -0
  187. data/spec/controller/{controller_render_spec/views/LayoutSpec → render_spec/views/layout_spec}/action.erb +0 -0
  188. data/spec/controller/{controller_render_spec → render_spec}/views/layouts/admin.erb +0 -0
  189. data/spec/controller/{controller_render_spec → render_spec}/views/layouts/app.html.erb +0 -0
  190. data/spec/controller/{controller_render_spec → render_spec}/views/layouts/app.js.erb +0 -0
  191. data/spec/controller/{controller_render_spec/views/MultipleActions → render_spec/views/multiple_actions}/actions.haml +0 -0
  192. data/spec/controller/render_spec/views/relative_spec/a/form.erb +1 -0
  193. data/spec/controller/render_spec/views/relative_spec/a/show.erb +1 -0
  194. data/spec/controller/render_spec/views/relative_spec/b/form.erb +1 -0
  195. data/spec/controller/{controller_render_spec → render_spec}/views/some_template.erb +0 -0
  196. data/spec/controller/{controller_render_spec → render_spec}/views/standalone.html.erb +0 -0
  197. data/spec/controller/{controller_render_spec.rb → render_spec.rb} +37 -27
  198. data/spec/{conveyor/conveyor_spec.rb → conveyors/conveyors_spec.rb} +36 -14
  199. data/spec/environment/config_spec.rb +13 -21
  200. data/spec/environment/environment_spec.rb +14 -41
  201. data/spec/environment/logger_spec.rb +4 -13
  202. data/spec/environment/minimal_app_spec/app.rb +1 -1
  203. data/spec/environment/minimal_app_spec.rb +12 -14
  204. data/spec/environment/standard_app_spec/app/lib/app/init.rb +1 -1
  205. data/spec/environment/standard_app_spec/plugin_a/lib/plugin_a/init.rb +1 -1
  206. data/spec/environment/standard_app_spec.rb +17 -25
  207. data/spec/html/basic_html_helper_spec.rb +7 -4
  208. data/spec/html/form_helper_spec.rb +5 -5
  209. data/spec/html/javascript_helper_spec.rb +9 -5
  210. data/spec/html/model_helper_spec.rb +9 -6
  211. data/spec/html/scoped_params_spec.rb +2 -2
  212. data/spec/html/spec_helper.rb +16 -24
  213. data/spec/http/http_spec.rb +14 -35
  214. data/spec/http/micelaneous_spec.rb +3 -3
  215. data/spec/{mail → mailer}/mail_controller_spec/views/body_template_spec/signup.erb +0 -0
  216. data/spec/{mail → mailer}/mail_controller_spec.rb +36 -12
  217. data/spec/mailer/spec_helper.rb +5 -0
  218. data/spec/remote/remote_spec.rb +23 -8
  219. data/spec/router/alias_router_spec.rb +29 -30
  220. data/spec/router/basic_router_spec.rb +44 -0
  221. data/spec/router/configurator_spec.rb +9 -6
  222. data/spec/router/integration_spec.rb +10 -7
  223. data/spec/router/object_router_spec.rb +186 -0
  224. data/spec/router/persistent_params_spec.rb +4 -4
  225. data/spec/router/restful_router_spec.rb +61 -53
  226. data/spec/router/{basic_spec.rb → router_spec.rb} +26 -23
  227. data/spec/router/routing_helper_spec.rb +5 -6
  228. data/spec/spec_helper.rb +4 -0
  229. data/spec/support/callbacks_spec.rb +1 -1
  230. data/spec/support/filters_spec.rb +2 -2
  231. data/spec/support/spec_helper.rb +1 -1
  232. data/spec/template/template_spec/views/format_for_partials/dialog.js.erb +1 -1
  233. data/spec/template/template_spec/views/nested/format/a.erb +1 -1
  234. data/spec/template/template_spec/views/nested/format/b.js.erb +1 -0
  235. data/spec/template/template_spec/views/nesting_format/dialog.js.erb +1 -1
  236. data/spec/template/template_spec.rb +62 -48
  237. data/spec/template/tilt_spec/views/concat_and_capture.erb +1 -1
  238. data/spec/template/tilt_spec/views/concat_and_capture.haml +1 -1
  239. data/spec/template/tilt_spec.rb +17 -19
  240. data/spec/{integration → web}/basic_spec/views/smoke_test_spec/action.erb +0 -0
  241. data/spec/{integration → web}/basic_spec.rb +31 -12
  242. data/spec/{integration → web}/controller_routing_helper_spec.rb +13 -11
  243. data/spec/{integration → web}/flash_spec.rb +57 -42
  244. data/spec/{integration → web}/spec_helper_spec.rb +11 -10
  245. data/spec/{integration → web}/view_routing_helper_spec.rb +44 -36
  246. metadata +338 -318
  247. data/lib/rad/controller/abstract_controller/micelaneous.rb +0 -31
  248. data/lib/rad/controller/abstract_controller/render.rb +0 -160
  249. data/lib/rad/controller/abstract_controller/responder.rb +0 -17
  250. data/lib/rad/controller/abstract_controller.rb +0 -64
  251. data/lib/rad/controller/controller_context.rb +0 -15
  252. data/lib/rad/controller/http_controller.rb +0 -48
  253. data/lib/rad/conveyor/conveyor.rb +0 -74
  254. data/lib/rad/conveyor/conveyors.rb +0 -20
  255. data/lib/rad/conveyor/params.rb +0 -14
  256. data/lib/rad/conveyor/processor.rb +0 -68
  257. data/lib/rad/conveyor/processors/conveyor_logger.rb +0 -25
  258. data/lib/rad/conveyor/workspace.rb +0 -36
  259. data/lib/rad/conveyor.rb +0 -29
  260. data/lib/rad/environment/dependency_resolver.rb +0 -107
  261. data/lib/rad/environment/environment.rb +0 -29
  262. data/lib/rad/environment/files_helper.rb +0 -55
  263. data/lib/rad/environment/logger.rb +0 -21
  264. data/lib/rad/html/flash.rb +0 -42
  265. data/lib/rad/html/helpers/basic_html_helper.rb +0 -83
  266. data/lib/rad/html/helpers/flash_helper.rb +0 -5
  267. data/lib/rad/html/helpers/form_helper.rb +0 -115
  268. data/lib/rad/html/helpers/html_helper.rb +0 -5
  269. data/lib/rad/html/helpers/javascript_helper.rb +0 -18
  270. data/lib/rad/html/helpers/model_helper.rb +0 -135
  271. data/lib/rad/http/http.rb +0 -21
  272. data/lib/rad/http/http_adapter.rb +0 -36
  273. data/lib/rad/http/middleware/static_files.rb +0 -21
  274. data/lib/rad/http/support/rack/rack_adapter.rb +0 -67
  275. data/lib/rad/http/support/rack/request.rb +0 -42
  276. data/lib/rad/http/support/rack/response.rb +0 -86
  277. data/lib/rad/integration/controller_micelaneous_helper.rb +0 -19
  278. data/lib/rad/integration/router/abstract_routing_helper.rb +0 -22
  279. data/lib/rad/integration/router/controller_routing_helper.rb +0 -58
  280. data/lib/rad/integration/router/view_routing_helper.rb +0 -104
  281. data/lib/rad/integration.rb +0 -30
  282. data/lib/rad/mail/letter.rb +0 -30
  283. data/lib/rad/mail/mail_controller.rb +0 -31
  284. data/lib/rad/mail/mailer.rb +0 -23
  285. data/lib/rad/mail/processors/letter_builder.rb +0 -36
  286. data/lib/rad/mail.rb +0 -15
  287. data/lib/rad/profiles/mail.rb +0 -16
  288. data/lib/rad/profiles/web_require.rb +0 -5
  289. data/lib/rad/remote/remote.rb +0 -15
  290. data/lib/rad/router/core/configurator.rb +0 -25
  291. data/lib/rad/router/core/core_routing_helper.rb +0 -41
  292. data/lib/rad/router/core/default_format_processor.rb +0 -12
  293. data/lib/rad/router/core/processors/router.rb +0 -29
  294. data/lib/rad/router/core/router.rb +0 -271
  295. data/lib/rad/router/core/simple_router.rb +0 -23
  296. data/lib/rad/router/routers/abstract_router.rb +0 -62
  297. data/lib/rad/router/routers/alias_router.rb +0 -113
  298. data/lib/rad/router/routers/restful_router.rb +0 -113
  299. data/lib/rad/spec/mail.rb +0 -31
  300. data/lib/rad/spec/view.rb +0 -10
  301. data/lib/rad/support/buffered_logger.rb +0 -44
  302. data/lib/rad/support/callbacks.rb +0 -168
  303. data/lib/rad/support/exception.rb +0 -31
  304. data/lib/rad/support/filters.rb +0 -34
  305. data/lib/rad/support/format.rb +0 -17
  306. data/lib/rad/support/micon.rb +0 -13
  307. data/lib/rad/support.rb +0 -63
  308. data/lib/rad/template/template.rb +0 -250
  309. data/spec/controller/abstract_controller_spec.rb +0 -132
  310. data/spec/controller/controller_context_spec.rb +0 -123
  311. data/spec/controller/controller_render_spec/views/rem ExplicitRenderSpec/action.erb +0 -1
  312. data/spec/controller/controller_render_spec/views/rem ExplicitRenderSpec/another_action.erb +0 -1
  313. data/spec/controller/spec_helper.rb +0 -19
  314. data/spec/conveyor/spec_helper.rb +0 -3
  315. data/spec/environment/config_spec/config.default.yml +0 -3
  316. data/spec/environment/config_spec/config.development.yml +0 -3
  317. data/spec/environment/config_spec/config.yml +0 -5
  318. data/spec/environment/spec_helper.rb +0 -1
  319. data/spec/http/http_spec/app/lib/app/init.rb +0 -10
  320. data/spec/http/http_spec/app/runtime/public/emptygit +0 -0
  321. data/spec/http/http_spec/plugin_a/lib/plugin_a/init.rb +0 -0
  322. data/spec/http/http_spec/plugin_b/lib/plugin_b/init.rb +0 -5
  323. data/spec/http/http_spec/plugin_b/static/emptygit +0 -0
  324. data/spec/http/spec_helper.rb +0 -5
  325. data/spec/integration/spec_helper.rb +0 -5
  326. data/spec/mail/spec_helper.rb +0 -7
  327. data/spec/remote/spec_helper.rb +0 -17
  328. data/spec/router/spec_helper.rb +0 -20
  329. data/spec/template/spec_helper.rb +0 -6
  330. data/spec/template/template_spec/views/nested/format/b.erb +0 -1
@@ -0,0 +1,20 @@
1
+ class Micon::Core
2
+ def register_extension name, &block
3
+ name.must_be.a Symbol
4
+ block.must_be.defined
5
+
6
+ raise "extension :#{name} already registered!" if extensions.include? name
7
+
8
+ extensions[name] = block
9
+ end
10
+
11
+ def extension name, target = nil, *args, &default_extension
12
+ name.must_be.a Symbol
13
+
14
+ if block = extensions[name] || default_extension
15
+ target ? target.instance_exec(*args, &block) : block.call(*args)
16
+ end
17
+ end
18
+
19
+ def extensions; @extensions ||= {} end
20
+ end
@@ -0,0 +1,32 @@
1
+ module Rad::Filters
2
+ inherit Rad::Callbacks
3
+
4
+ module ClassMethods
5
+ def before *args, &block
6
+ opt = args.extract_options!
7
+ if block
8
+ set_callback :action, :before, opt, &block
9
+ else
10
+ args.each{|executor| set_callback :action, :before, executor, opt}
11
+ end
12
+ end
13
+
14
+ def around *args, &block
15
+ opt = args.extract_options!
16
+ if block
17
+ set_callback :action, :around, opt, &block
18
+ else
19
+ args.each{|executor| set_callback :action, :around, executor, opt}
20
+ end
21
+ end
22
+
23
+ def after *args, &block
24
+ opt = args.extract_options!
25
+ if block
26
+ set_callback :action, :after, opt, &block
27
+ else
28
+ args.each{|executor| set_callback :action, :after, executor, opt}
29
+ end
30
+ end
31
+ end
32
+ end
File without changes
@@ -9,5 +9,11 @@ module Mime
9
9
  type = ".#{type}" unless type =~ /^\./
10
10
  Rack::Mime.mime_type(type) || raise("Unknown MIME type: #{type}")
11
11
  end
12
+
13
+ def image? file_name
14
+ return false if file_name.blank?
15
+ extension = File.extname(file_name)
16
+ Rack::Mime.mime_type(extension) =~ /image/
17
+ end
12
18
  end
13
19
  end
@@ -5,8 +5,9 @@ class Module
5
5
  # If no environment given uses non-cached version.
6
6
  #
7
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"
8
+ escaped_method = escape_method(method)
9
+ method_with_cache, method_without_cache = "#{escaped_method}_with_cache", "#{escaped_method}_without_cache"
10
+ iv = "@#{escaped_method}_cache"
10
11
 
11
12
  # raise "Method '#{method}' already defined!" if instance_methods.include?(method)
12
13
  if instance_methods.include?(method_with_cache) or instance_methods.include?(method_without_cache)
@@ -31,13 +32,10 @@ class Module
31
32
  result
32
33
  end
33
34
 
34
- # listen to environment events
35
- rad.after :config do |config|
36
- if config.production?
37
- alias_method method, method_with_cache
38
- else
39
- alias_method method, method_without_cache
40
- end
35
+ if rad.mode == :production
36
+ alias_method method, method_with_cache
37
+ else
38
+ alias_method method, method_without_cache
41
39
  end
42
40
 
43
41
  # by default uses non-cached version
@@ -0,0 +1,62 @@
1
+ #
2
+ # ruby
3
+ #
4
+ raise 'ruby 1.9.2 or higher required!' unless RUBY_VERSION >= '1.9.2'
5
+ require 'rad/_support/encoding'
6
+
7
+
8
+ #
9
+ # gems
10
+ #
11
+ require 'rad/gems'
12
+
13
+
14
+ #
15
+ # dependencies
16
+ #
17
+ require 'rad/_support/active_support'
18
+
19
+ require 'ruby_ext'
20
+
21
+ require 'vfs'
22
+
23
+ require 'ruby_ext/more/open_constructor'
24
+ require 'rad/_support/ruby_ext_with_active_support'
25
+
26
+ require 'class_loader'
27
+
28
+ require 'micon'
29
+ require 'micon/rad'
30
+ # require 'rad/_support/micon'
31
+
32
+ require 'rad/_support/class_loader'
33
+
34
+ require 'dictionary'
35
+
36
+ require 'thread'
37
+ require 'time'
38
+ require 'uri'
39
+ require 'json'
40
+
41
+
42
+ require 'addressable/uri'
43
+ require 'rad/_support/addressable'
44
+ ::Uri = Addressable::URI
45
+
46
+ #
47
+ # libraries
48
+ #
49
+ require 'rad/_support/hacks_and_fixes'
50
+
51
+ autoload :Nokogiri, 'nokogiri'
52
+
53
+ [
54
+ 'module',
55
+ 'callbacks',
56
+ 'filters',
57
+ 'mime',
58
+ 'string',
59
+ 'rson',
60
+ 'exception',
61
+ 'extensions'
62
+ ].each{|f| require "rad/_support/#{f}"}
File without changes
@@ -3,9 +3,17 @@ class String
3
3
  ERB::Util.json_escape self
4
4
  end
5
5
 
6
+ HTML_ESCAPE_MAP = { '&' => '&amp;', '>' => '&gt;', '<' => '&lt;', '"' => '&quot;' }
6
7
  def html_escape
8
+ # ERB and Rack both are replacing '/' character, and it's wrong because it destroys links (like '/default/my_item')
7
9
  # ERB::Util.html_escape self
8
- Rack::Utils.escape_html self
10
+ # Rack::Utils.escape_html self
11
+
12
+ gsub(/[&"><]/){|special| HTML_ESCAPE_MAP[special]}
13
+ end
14
+
15
+ def url_escape
16
+ CGI.escape self
9
17
  end
10
18
 
11
19
  JS_ESCAPE_MAP = {
@@ -0,0 +1,27 @@
1
+ module Rad::Controller::Abstract::Micelaneous
2
+ #
3
+ # respond_to
4
+ #
5
+ def respond_to &block
6
+ @_responder.must_be.nil
7
+ @_responder = Rad::Controller::Abstract::Responder.new
8
+ block.call @_responder
9
+ handler = @_responder.handlers[params.format]
10
+ raise "can't respond to '#{params.format}' format!" unless handler
11
+ handler.call
12
+ end
13
+
14
+ module ClassMethods
15
+ #
16
+ # filter_parameter_logging
17
+ #
18
+ inheritable_accessor :filter_parameter_logging, []
19
+ def filter_parameter_logging_with_sugar *parameters
20
+ if parameters.empty?
21
+ filter_parameter_logging_without_sugar
22
+ else
23
+ filter_parameter_logging_without_sugar.push *parameters.collect(&:to_s)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,159 @@
1
+ module Rad::Controller::Abstract::Render
2
+ SPECIAL_FORMAT_HANDLERS = {
3
+ json: lambda{|o| o.to_json},
4
+ xml: lambda{|o| o.to_xml},
5
+ js: lambda{|o| o},
6
+ }
7
+
8
+ def _layout *args
9
+ @_layout = *args unless args.empty?
10
+ @_layout
11
+ end
12
+ def _layout= layout
13
+ @_layout = layout
14
+ end
15
+
16
+ def render *args
17
+ options = rad.template.parse_arguments *args
18
+ content = render_with_parsed_arguments options, args
19
+ throw :halt, content
20
+ end
21
+
22
+ protected
23
+ def render_action options
24
+ instance_variables = {
25
+ action_name: (options[:action] || workspace.action).to_sym,
26
+ controller_name: self.class.controller_name
27
+ }
28
+ instance_variable_names.each do |name|
29
+ instance_variables[name[1..-1]] = instance_variable_get name unless name =~ /^@_/
30
+ end
31
+ context = self.class.context_class.new(instance_variables, self)
32
+
33
+ options[:template] ||= options.delete(:action)
34
+ options[:template].must_be.present
35
+ options[:template] = options[:template].to_s
36
+
37
+ options.reverse_merge!(
38
+ context: context,
39
+ format: params.format,
40
+ exact_format: true,
41
+ prefixes: ['']
42
+ )
43
+
44
+ # rendering content
45
+ content, context = render_content options
46
+
47
+ # rendering layout
48
+ options[:content] = context
49
+ render_layout options, content
50
+ end
51
+
52
+ def render_layout options, content
53
+ layout = options.include?(:layout) ? options[:layout] : self._layout
54
+ if layout # and rad.template.exist? layout, options
55
+ rad.template.render layout, options do |*args|
56
+ if args.empty?
57
+ content
58
+ else
59
+ args.size.must_be == 1
60
+ variable_name = args.first.to_s
61
+ options[:context].content_variables[variable_name]
62
+ end
63
+ end
64
+ else
65
+ content
66
+ end
67
+ end
68
+
69
+ def render_content options
70
+ rad.template.basic_render options.merge(relative_path_resolver: self.class, if_not_exist: '/rad_default_templates/blank_template')
71
+ end
72
+
73
+ def render_with_parsed_arguments options, original_args
74
+ if special_format = SPECIAL_FORMAT_HANDLERS.keys.find{|f| options.include? f}
75
+ handler = SPECIAL_FORMAT_HANDLERS[special_format]
76
+ if special_format.to_s != params.format
77
+ raise "You trying responing with '#{special_format}' to the '#{params.format}' requested format!"
78
+ end
79
+ handler.call options[special_format]
80
+ elsif options.include? :inline
81
+ options[:inline]
82
+ elsif options[:template] == :nothing
83
+ ''
84
+ else
85
+ render_action options
86
+ end
87
+ end
88
+
89
+ module ClassMethods
90
+ def layout layout, options = {}
91
+ before options do |controller|
92
+ controller._layout = layout
93
+ end
94
+ end
95
+
96
+ def context_class
97
+ unless @context_class
98
+ parent_context_class = nil
99
+ ancestors[1..-1].each do |anc|
100
+ break if parent_context_class = anc.respond_to(:context_class)
101
+ end
102
+ parent_context_class ||= Rad::Controller::Context
103
+
104
+ class_name = "#{self.name}::#{self.name.split('::').last}Context"
105
+
106
+ # raise "Tempate context #{class_name} already defined!" if Object.const_defined? class_name
107
+ eval "class #{class_name} < #{parent_context_class}; end", TOPLEVEL_BINDING, __FILE__, __LINE__
108
+ @context_class = class_name.constantize
109
+ end
110
+ @context_class
111
+ end
112
+
113
+ def find_relative_template *args
114
+ return _find_relative_template *args unless rad.production?
115
+
116
+ # use cache
117
+ @relative_template ||= {}
118
+ unless @relative_template.include? args
119
+ @relative_template[args] = _find_relative_template *args
120
+ end
121
+ @relative_template[args]
122
+ end
123
+
124
+ def _find_relative_template tname, prefixes, format, exact_format, current_dir
125
+ tname.must_be.present
126
+
127
+ path = nil
128
+
129
+ # own templates
130
+ ["/#{controller_name.underscore}/#{tname}", "/#{controller_name.gsub('::', '/')}/#{tname}"].each do |name|
131
+ path ||= rad.template.find_file(name, prefixes, format, exact_format, rad.template.paths)
132
+ end
133
+
134
+ # own :actions templates
135
+ ["/#{controller_name.underscore}/actions", "/#{controller_name.gsub('::', '/')}/actions"].each do |name|
136
+ unless path
137
+ path = rad.template.find_file(name, prefixes, format, exact_format, rad.template.paths)
138
+ path = nil if path and (File.read(path) !~ /^.*when.+[^_a-zA-Z0-9]#{tname}[^_a-zA-Z0-9].*$/)
139
+ end
140
+ end
141
+
142
+ # superclasses templates
143
+ unless path
144
+ parent = ancestors[1..-1].find{|a| a.respond_to?(:find_relative_template)} # and a.instance_methods.include?(action)
145
+ if parent and parent != Rad::Controller::Abstract
146
+ path = parent.find_relative_template(tname, prefixes, format, exact_format, current_dir)
147
+ end
148
+ end
149
+
150
+ # relative template
151
+ if !path and current_dir
152
+ path = rad.template.relative_path_resolver.find_relative_template(tname, prefixes, format, exact_format, current_dir)
153
+ end
154
+
155
+ return path
156
+ end
157
+
158
+ end
159
+ end
@@ -0,0 +1,13 @@
1
+ class Rad::Controller::Abstract::Responder < BasicObject
2
+ attr_reader :handlers
3
+
4
+ def initialize
5
+ @handlers = {}
6
+ end
7
+
8
+ protected
9
+ def method_missing m, *args, &block
10
+ args.must_be.empty
11
+ handlers[m.to_s] = block || lambda{} #.must_be.defined
12
+ end
13
+ end
@@ -0,0 +1,37 @@
1
+ module Rad::Controller::Abstract
2
+ inherit Rad::Filters
3
+ inherit Rad::Controller::Abstract::Render, Rad::Controller::Abstract::Micelaneous
4
+
5
+ inject workspace: :workspace, logger: :logger
6
+
7
+ def params
8
+ workspace.params
9
+ end
10
+
11
+ # def response
12
+ # workspace.response
13
+ # end
14
+
15
+ module ClassMethods
16
+ inject workspace: :workspace, logger: :logger
17
+
18
+ def controller_name
19
+ self.namespace ? "#{self.namespace.name}::#{self.alias}" : self.alias
20
+ end
21
+
22
+ def helper *args
23
+ args.to_a.each do |mod|
24
+ mod.must_be.a Module
25
+ context_class.inherit mod
26
+ end
27
+ end
28
+
29
+ def helper_method *args
30
+ args = args.first if args.size == 1 and args.first.is_a?(Array)
31
+ # args.each{|m| m.to_s.must_be.in self.instance_methods}
32
+ args.each do |m|
33
+ context_class.delegate m, to: :controller
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,15 @@
1
+ class Rad::Controller::Context < Rad::Template::Context
2
+ attr_reader :controller
3
+ def initialize instance_variables, controller
4
+ super instance_variables
5
+ @controller = controller
6
+ end
7
+
8
+ def controller_name
9
+ @controller_name #workspace.controller.class.controller_name
10
+ end
11
+
12
+ def action_name
13
+ @action_name #workspace.action.to_sym
14
+ end
15
+ end
@@ -0,0 +1,50 @@
1
+ module Rad::Controller::Http
2
+ inherit Rad::Controller::Abstract
3
+
4
+ # def response
5
+ # workspace.response
6
+ # end
7
+
8
+ protected
9
+ def render_with_parsed_arguments options, original_args
10
+ response = workspace.response
11
+ response.set!(
12
+ status: options[:status] || :ok,
13
+ content_type: options[:content_type] || Mime[params.format]
14
+ )
15
+
16
+ if original_args.size == 1 and (status = Rad::Http::Response.decode_status_message(original_args.first))
17
+ response.set! status: status
18
+ throw :halt, ""
19
+ elsif options[:location]
20
+ redirect_to options[:location]
21
+ else
22
+ super
23
+ end
24
+ end
25
+
26
+ module ClassMethods
27
+ inheritable_accessor :actions_allowed_for_get_request, []
28
+
29
+ def allow_get_for *methods
30
+ methods = methods.first if methods.first.is_a? Array
31
+
32
+ enable_protection_from_get_requests!
33
+ actions_allowed_for_get_request.push *(methods.collect(&:to_sym))
34
+ end
35
+
36
+ private
37
+ def enable_protection_from_get_requests!
38
+ unless respond_to? :protect_from_get_request
39
+ define_method :protect_from_get_request do
40
+ request = workspace.request
41
+ get = !(request.post? or request.put? or request.delete?)
42
+ if get and !self.class.actions_allowed_for_get_request.include?(workspace.action)
43
+ raise "GET request not allowed for :#{workspace.action} action!"
44
+ end
45
+ end
46
+ before :protect_from_get_request
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,19 @@
1
+ #
2
+ # Libraries
3
+ #
4
+ class Rad::Controller
5
+ attr_accessor :development_error_template, :production_error_template, :test_error_template
6
+
7
+ module Abstract
8
+ end
9
+ end
10
+
11
+ %w(
12
+ _abstract/render
13
+ _abstract/responder
14
+ _abstract/micelaneous
15
+ _abstract
16
+ _context
17
+
18
+ _http
19
+ ).each{|f| require "rad/controller/#{f}"}
@@ -0,0 +1 @@
1
+ rad.controller
@@ -0,0 +1 @@
1
+ rad.controller
@@ -0,0 +1 @@
1
+ rad.controller
@@ -1,28 +1,26 @@
1
- module Rad
2
- module Processors
3
- class ControllerCaller < Processor
4
- def call
5
- # prepare
6
- response = workspace.response.must_be.defined
7
- klass = workspace.class.must_be.present
8
- raise "The controller class #{klass} must be a Rad::AbstractController!" unless klass.is? Rad::AbstractController
9
- controller = workspace.controller = klass.new
10
- action = workspace.action = workspace.method_name
11
- format = workspace.params.format
1
+ rad.controller
12
2
 
13
- # call
14
-
15
- workspace.content = catch :halt_render do
16
- controller.run_callbacks :action, method: action do
17
- # call controller
18
- controller.send action
3
+ class ControllerCaller < Rad::Conveyors::Processor
4
+ def call
5
+ # prepare
6
+ response = workspace.response.must_be.defined
7
+ klass = workspace.class.must_be.present
8
+ raise "The controller class #{klass} must be a Rad::Controller::Abstract!" unless klass.is? Rad::Controller::Abstract
9
+ controller = workspace.controller = klass.new
10
+ action = workspace.action = workspace.method_name
11
+ format = workspace.params.format
19
12
 
20
- # render view
21
- controller.render action: action
22
- end
23
- end
24
- end
13
+ # call
25
14
 
26
- end
27
- end
15
+ workspace.content = catch :halt do
16
+ controller.run_callbacks :action, method: action do
17
+ # call controller
18
+ controller.send action
19
+
20
+ # render view
21
+ controller.render action: action
22
+ end
23
+ end
24
+ end
25
+
28
26
  end
@@ -1,51 +1,49 @@
1
- module Rad
2
- module Processors
3
- class ControllerErrorHandling < Processor
4
- def call
5
- workspace.response.must_be.defined
6
-
7
- begin
8
- next_processor.call
9
- rescue StandardError => e
10
- if config.test?
11
- e.set_backtrace e.backtrace.sfilter(Exception.common_filters)
12
- raise e
13
- elsif config.production?
14
- error_shown_to_user = StandardError.new "Internal error!"
15
- error_shown_to_user.set_backtrace []
16
- else
17
- error_shown_to_user = e
18
- end
19
-
20
- workspace.response.clear if workspace.response?
21
- format = workspace.params.format
22
- handler = SPECIAL_ERROR_HANDLERS[format] || DEFAULT_ERROR_HANDLER
23
- workspace.content = handler.call error_shown_to_user, format
24
-
25
-
26
- logger.error e
27
- logger.info "\n"
28
- end
29
- end
1
+ rad.controller
2
+
3
+ class ControllerErrorHandling < Rad::Conveyors::Processor
4
+ def call
5
+ workspace.response.must_be.defined
30
6
 
31
- SPECIAL_ERROR_HANDLERS = {
32
- 'json' => lambda{|e, format|
33
- {error: e.message}.to_json
34
- }
35
- }
7
+ begin
8
+ next_processor.call
9
+ rescue StandardError => e
10
+ if rad.test?
11
+ e.set_backtrace e.backtrace.sfilter(Exception.filters)
12
+ raise e
13
+ elsif rad.production?
14
+ error_shown_to_user = StandardError.new "Internal error!"
15
+ error_shown_to_user.set_backtrace []
16
+ else
17
+ error_shown_to_user = e
18
+ end
36
19
 
37
- DEFAULT_ERROR_HANDLER = lambda{|e, format|
38
- tname = rad.config["#{rad.config.environment!}_error_template", nil]
39
-
40
- if tname and Template.exist?(tname, format: format, exact_format: true)
41
- data = Template.render(tname,
42
- format: format,
43
- locals: {error: e}
44
- )
45
- else
46
- e.message
47
- end
48
- }
49
- end
50
- end
20
+ workspace.response.clear if workspace.response?
21
+ format = workspace.params.format
22
+ handler = SPECIAL_ERROR_HANDLERS[format] || DEFAULT_ERROR_HANDLER
23
+ workspace.content = handler.call error_shown_to_user, format
24
+
25
+
26
+ logger.error e
27
+ logger.info "\n"
28
+ end
29
+ end
30
+
31
+ SPECIAL_ERROR_HANDLERS = {
32
+ 'json' => lambda{|e, format|
33
+ {error: e.message}.to_json
34
+ }
35
+ }
36
+
37
+ DEFAULT_ERROR_HANDLER = lambda{|e, format|
38
+ tname = rad.controller.send("#{rad.mode}_error_template")
39
+
40
+ if tname and rad.template.exist?(tname, format: format, exact_format: true)
41
+ data = rad.template.render(tname,
42
+ format: format,
43
+ locals: {error: e}
44
+ )
45
+ else
46
+ e.message
47
+ end
48
+ }
51
49
  end