thorero 0.9.4.4 → 0.9.4.5

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 (298) hide show
  1. data/LICENSE +1 -1
  2. data/README +21 -0
  3. data/Rakefile +275 -108
  4. data/TODO +0 -0
  5. data/bin/merb +12 -0
  6. data/bin/merb-specs +5 -0
  7. data/docs/bootloading.dox +58 -0
  8. data/docs/documentation_standards +40 -0
  9. data/docs/merb-core-call-stack-diagram.mmap +0 -0
  10. data/docs/merb-core-call-stack-diagram.pdf +0 -0
  11. data/docs/merb-core-call-stack-diagram.png +0 -0
  12. data/docs/new_render_api +51 -0
  13. data/lib/merb-core.rb +603 -0
  14. data/lib/merb-core/autoload.rb +32 -0
  15. data/lib/merb-core/bootloader.rb +708 -0
  16. data/lib/merb-core/config.rb +303 -0
  17. data/lib/merb-core/constants.rb +43 -0
  18. data/lib/merb-core/controller/abstract_controller.rb +578 -0
  19. data/lib/merb-core/controller/exceptions.rb +302 -0
  20. data/lib/merb-core/controller/merb_controller.rb +256 -0
  21. data/lib/merb-core/controller/mime.rb +106 -0
  22. data/lib/merb-core/controller/mixins/authentication.rb +87 -0
  23. data/lib/merb-core/controller/mixins/controller.rb +290 -0
  24. data/lib/merb-core/controller/mixins/render.rb +481 -0
  25. data/lib/merb-core/controller/mixins/responder.rb +472 -0
  26. data/lib/merb-core/controller/template.rb +254 -0
  27. data/lib/merb-core/core_ext.rb +8 -0
  28. data/lib/merb-core/core_ext/kernel.rb +319 -0
  29. data/lib/merb-core/dispatch/cookies.rb +91 -0
  30. data/lib/merb-core/dispatch/dispatcher.rb +278 -0
  31. data/lib/merb-core/dispatch/exceptions.html.erb +303 -0
  32. data/lib/merb-core/dispatch/request.rb +603 -0
  33. data/lib/merb-core/dispatch/router.rb +179 -0
  34. data/lib/merb-core/dispatch/router/behavior.rb +867 -0
  35. data/lib/merb-core/dispatch/router/cached_proc.rb +52 -0
  36. data/lib/merb-core/dispatch/router/route.rb +321 -0
  37. data/lib/merb-core/dispatch/session.rb +78 -0
  38. data/lib/merb-core/dispatch/session/cookie.rb +168 -0
  39. data/lib/merb-core/dispatch/session/memcached.rb +184 -0
  40. data/lib/merb-core/dispatch/session/memory.rb +241 -0
  41. data/lib/merb-core/dispatch/worker.rb +28 -0
  42. data/lib/merb-core/gem_ext/erubis.rb +77 -0
  43. data/lib/{extlib → merb-core}/logger.rb +2 -2
  44. data/lib/merb-core/plugins.rb +59 -0
  45. data/lib/merb-core/rack.rb +21 -0
  46. data/lib/merb-core/rack/adapter.rb +44 -0
  47. data/lib/merb-core/rack/adapter/ebb.rb +25 -0
  48. data/lib/merb-core/rack/adapter/evented_mongrel.rb +26 -0
  49. data/lib/merb-core/rack/adapter/fcgi.rb +17 -0
  50. data/lib/merb-core/rack/adapter/irb.rb +118 -0
  51. data/lib/merb-core/rack/adapter/mongrel.rb +26 -0
  52. data/lib/merb-core/rack/adapter/runner.rb +28 -0
  53. data/lib/merb-core/rack/adapter/swiftiplied_mongrel.rb +26 -0
  54. data/lib/merb-core/rack/adapter/thin.rb +39 -0
  55. data/lib/merb-core/rack/adapter/thin_turbo.rb +24 -0
  56. data/lib/merb-core/rack/adapter/webrick.rb +36 -0
  57. data/lib/merb-core/rack/application.rb +18 -0
  58. data/lib/merb-core/rack/handler/mongrel.rb +97 -0
  59. data/lib/merb-core/rack/middleware.rb +26 -0
  60. data/lib/merb-core/rack/middleware/path_prefix.rb +31 -0
  61. data/lib/merb-core/rack/middleware/profiler.rb +19 -0
  62. data/lib/merb-core/rack/middleware/static.rb +45 -0
  63. data/lib/merb-core/server.rb +252 -0
  64. data/lib/merb-core/tasks/audit.rake +68 -0
  65. data/lib/merb-core/tasks/merb.rb +1 -0
  66. data/lib/merb-core/tasks/merb_rake_helper.rb +12 -0
  67. data/lib/merb-core/test.rb +11 -0
  68. data/lib/merb-core/test/helpers.rb +9 -0
  69. data/lib/merb-core/test/helpers/controller_helper.rb +8 -0
  70. data/lib/merb-core/test/helpers/multipart_request_helper.rb +175 -0
  71. data/lib/merb-core/test/helpers/request_helper.rb +344 -0
  72. data/lib/merb-core/test/helpers/route_helper.rb +33 -0
  73. data/lib/merb-core/test/helpers/view_helper.rb +121 -0
  74. data/lib/merb-core/test/matchers.rb +9 -0
  75. data/lib/merb-core/test/matchers/controller_matchers.rb +319 -0
  76. data/lib/merb-core/test/matchers/route_matchers.rb +136 -0
  77. data/lib/merb-core/test/matchers/view_matchers.rb +335 -0
  78. data/lib/merb-core/test/run_specs.rb +47 -0
  79. data/lib/merb-core/test/tasks/spectasks.rb +68 -0
  80. data/lib/merb-core/test/test_ext/hpricot.rb +32 -0
  81. data/lib/merb-core/test/test_ext/object.rb +14 -0
  82. data/lib/merb-core/test/test_ext/string.rb +14 -0
  83. data/lib/merb-core/vendor/facets.rb +2 -0
  84. data/lib/merb-core/vendor/facets/dictionary.rb +433 -0
  85. data/lib/merb-core/vendor/facets/inflect.rb +345 -0
  86. data/lib/merb-core/version.rb +11 -0
  87. data/spec/private/config/adapter_spec.rb +32 -0
  88. data/spec/private/config/config_spec.rb +202 -0
  89. data/spec/private/config/environment_spec.rb +13 -0
  90. data/spec/private/config/spec_helper.rb +1 -0
  91. data/spec/private/core_ext/kernel_spec.rb +169 -0
  92. data/spec/private/dispatch/bootloader_spec.rb +24 -0
  93. data/spec/private/dispatch/cookies_spec.rb +107 -0
  94. data/spec/private/dispatch/dispatch_spec.rb +35 -0
  95. data/spec/private/dispatch/fixture/app/controllers/application.rb +4 -0
  96. data/spec/private/dispatch/fixture/app/controllers/exceptions.rb +27 -0
  97. data/spec/private/dispatch/fixture/app/controllers/foo.rb +21 -0
  98. data/spec/private/dispatch/fixture/app/helpers/global_helpers.rb +8 -0
  99. data/spec/private/dispatch/fixture/app/views/exeptions/client_error.html.erb +37 -0
  100. data/spec/private/dispatch/fixture/app/views/exeptions/internal_server_error.html.erb +216 -0
  101. data/spec/private/dispatch/fixture/app/views/exeptions/not_acceptable.html.erb +38 -0
  102. data/spec/private/dispatch/fixture/app/views/exeptions/not_found.html.erb +40 -0
  103. data/spec/private/dispatch/fixture/app/views/foo/bar.html.erb +0 -0
  104. data/spec/private/dispatch/fixture/app/views/layout/application.html.erb +11 -0
  105. data/spec/private/dispatch/fixture/config/black_hole.rb +12 -0
  106. data/spec/private/dispatch/fixture/config/environments/development.rb +6 -0
  107. data/spec/private/dispatch/fixture/config/environments/production.rb +5 -0
  108. data/spec/private/dispatch/fixture/config/environments/test.rb +6 -0
  109. data/spec/private/dispatch/fixture/config/init.rb +45 -0
  110. data/spec/private/dispatch/fixture/config/rack.rb +11 -0
  111. data/spec/private/dispatch/fixture/config/router.rb +35 -0
  112. data/spec/private/dispatch/fixture/log/merb_test.log +1874 -0
  113. data/spec/private/dispatch/fixture/public/images/merb.jpg +0 -0
  114. data/spec/private/dispatch/fixture/public/merb.fcgi +4 -0
  115. data/spec/private/dispatch/fixture/public/stylesheets/master.css +119 -0
  116. data/spec/private/dispatch/route_params_spec.rb +24 -0
  117. data/spec/private/dispatch/session_mixin_spec.rb +47 -0
  118. data/spec/private/dispatch/spec_helper.rb +1 -0
  119. data/spec/private/plugins/plugin_spec.rb +166 -0
  120. data/spec/private/rack/application_spec.rb +49 -0
  121. data/spec/private/router/behavior_spec.rb +60 -0
  122. data/spec/private/router/fixture/log/merb_test.log +139 -0
  123. data/spec/private/router/route_spec.rb +414 -0
  124. data/spec/private/router/router_spec.rb +175 -0
  125. data/spec/private/vendor/facets/plural_spec.rb +564 -0
  126. data/spec/private/vendor/facets/singular_spec.rb +489 -0
  127. data/spec/public/DEFINITIONS +11 -0
  128. data/spec/public/abstract_controller/controllers/alt_views/layout/application.erb +1 -0
  129. data/spec/public/abstract_controller/controllers/alt_views/layout/merb/test/fixtures/abstract/render_string_controller_layout.erb +1 -0
  130. data/spec/public/abstract_controller/controllers/alt_views/layout/merb/test/fixtures/abstract/render_template_controller_layout.erb +1 -0
  131. data/spec/public/abstract_controller/controllers/alt_views/merb/test/fixtures/abstract/display_object_with_multiple_roots/index.erb +1 -0
  132. data/spec/public/abstract_controller/controllers/alt_views/merb/test/fixtures/abstract/display_object_with_multiple_roots/show.erb +1 -0
  133. data/spec/public/abstract_controller/controllers/alt_views/merb/test/fixtures/abstract/render_template_multiple_roots/index.erb +1 -0
  134. data/spec/public/abstract_controller/controllers/alt_views/partial/basic_partial_with_multiple_roots/_partial.erb +1 -0
  135. data/spec/public/abstract_controller/controllers/alt_views/render_template_multiple_roots_and_custom_location/index.erb +1 -0
  136. data/spec/public/abstract_controller/controllers/alt_views/render_template_multiple_roots_inherited/index.erb +1 -0
  137. data/spec/public/abstract_controller/controllers/cousins.rb +41 -0
  138. data/spec/public/abstract_controller/controllers/display.rb +54 -0
  139. data/spec/public/abstract_controller/controllers/filters.rb +193 -0
  140. data/spec/public/abstract_controller/controllers/helpers.rb +41 -0
  141. data/spec/public/abstract_controller/controllers/partial.rb +121 -0
  142. data/spec/public/abstract_controller/controllers/render.rb +113 -0
  143. data/spec/public/abstract_controller/controllers/views/helpers/capture/index.erb +1 -0
  144. data/spec/public/abstract_controller/controllers/views/helpers/capture_eq/index.erb +1 -0
  145. data/spec/public/abstract_controller/controllers/views/helpers/capture_with_args/index.erb +1 -0
  146. data/spec/public/abstract_controller/controllers/views/helpers/concat/index.erb +1 -0
  147. data/spec/public/abstract_controller/controllers/views/layout/alt.erb +1 -0
  148. data/spec/public/abstract_controller/controllers/views/layout/custom.erb +1 -0
  149. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/display_object/index.erb +1 -0
  150. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/display_object_with_action/new.erb +1 -0
  151. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template/index.erb +1 -0
  152. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_app_layout/index.erb +0 -0
  153. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_custom_layout/index.erb +1 -0
  154. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_multiple_roots/index.erb +1 -0
  155. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_multiple_roots/show.erb +1 -0
  156. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_two_throw_contents/index.erb +1 -0
  157. data/spec/public/abstract_controller/controllers/views/partial/another_directory/_partial.erb +1 -0
  158. data/spec/public/abstract_controller/controllers/views/partial/basic_partial/_partial.erb +1 -0
  159. data/spec/public/abstract_controller/controllers/views/partial/basic_partial/index.erb +1 -0
  160. data/spec/public/abstract_controller/controllers/views/partial/basic_partial_with_multiple_roots/index.erb +1 -0
  161. data/spec/public/abstract_controller/controllers/views/partial/nested_partial/_first.erb +1 -0
  162. data/spec/public/abstract_controller/controllers/views/partial/nested_partial/_second.erb +1 -0
  163. data/spec/public/abstract_controller/controllers/views/partial/nested_partial/index.erb +1 -0
  164. data/spec/public/abstract_controller/controllers/views/partial/partial_in_another_directory/index.erb +1 -0
  165. data/spec/public/abstract_controller/controllers/views/partial/partial_with_both/_collection.erb +1 -0
  166. data/spec/public/abstract_controller/controllers/views/partial/partial_with_both/index.erb +1 -0
  167. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections/_collection.erb +1 -0
  168. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections/index.erb +1 -0
  169. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_as/_collection.erb +1 -0
  170. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_as/index.erb +1 -0
  171. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_counter/_collection.erb +1 -0
  172. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_counter/index.erb +1 -0
  173. data/spec/public/abstract_controller/controllers/views/partial/partial_with_locals/_variables.erb +1 -0
  174. data/spec/public/abstract_controller/controllers/views/partial/partial_with_locals/index.erb +1 -0
  175. data/spec/public/abstract_controller/controllers/views/partial/partial_with_with_and_locals/_both.erb +1 -0
  176. data/spec/public/abstract_controller/controllers/views/partial/partial_with_with_and_locals/index.erb +1 -0
  177. data/spec/public/abstract_controller/controllers/views/partial/with_absolute_partial/_partial.erb +1 -0
  178. data/spec/public/abstract_controller/controllers/views/partial/with_absolute_partial/index.erb +1 -0
  179. data/spec/public/abstract_controller/controllers/views/partial/with_as_partial/_with_partial.erb +1 -0
  180. data/spec/public/abstract_controller/controllers/views/partial/with_as_partial/index.erb +1 -0
  181. data/spec/public/abstract_controller/controllers/views/partial/with_nil_partial/_with_partial.erb +1 -0
  182. data/spec/public/abstract_controller/controllers/views/partial/with_nil_partial/index.erb +1 -0
  183. data/spec/public/abstract_controller/controllers/views/partial/with_partial/_with_partial.erb +1 -0
  184. data/spec/public/abstract_controller/controllers/views/partial/with_partial/index.erb +1 -0
  185. data/spec/public/abstract_controller/controllers/views/test_display/foo.html.erb +1 -0
  186. data/spec/public/abstract_controller/controllers/views/test_render/foo.html.erb +0 -0
  187. data/spec/public/abstract_controller/controllers/views/wonderful/index.erb +1 -0
  188. data/spec/public/abstract_controller/display_spec.rb +33 -0
  189. data/spec/public/abstract_controller/filter_spec.rb +106 -0
  190. data/spec/public/abstract_controller/helper_spec.rb +21 -0
  191. data/spec/public/abstract_controller/partial_spec.rb +61 -0
  192. data/spec/public/abstract_controller/render_spec.rb +90 -0
  193. data/spec/public/abstract_controller/spec_helper.rb +31 -0
  194. data/spec/public/boot_loader/boot_loader_spec.rb +33 -0
  195. data/spec/public/boot_loader/spec_helper.rb +1 -0
  196. data/spec/public/controller/authentication_spec.rb +103 -0
  197. data/spec/public/controller/base_spec.rb +36 -0
  198. data/spec/public/controller/controllers/authentication.rb +45 -0
  199. data/spec/public/controller/controllers/base.rb +36 -0
  200. data/spec/public/controller/controllers/display.rb +118 -0
  201. data/spec/public/controller/controllers/redirect.rb +30 -0
  202. data/spec/public/controller/controllers/responder.rb +93 -0
  203. data/spec/public/controller/controllers/url.rb +7 -0
  204. data/spec/public/controller/controllers/views/layout/custom.html.erb +1 -0
  205. data/spec/public/controller/controllers/views/layout/custom_arg.html.erb +1 -0
  206. data/spec/public/controller/controllers/views/layout/custom_arg.json.erb +1 -0
  207. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_and_local_provides/index.html.erb +1 -0
  208. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_and_local_provides/index.xml.erb +1 -0
  209. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_provides/index.html.erb +1 -0
  210. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_provides/index.xml.erb +1 -0
  211. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template/index.html.erb +1 -0
  212. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template/no_layout.html.erb +1 -0
  213. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template_argument/index.html.erb +1 -0
  214. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/html_default/index.html.erb +1 -0
  215. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/layout/custom.html.erb +1 -0
  216. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/local_provides/index.html.erb +1 -0
  217. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/local_provides/index.xml.erb +1 -0
  218. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/multi_provides/index.html.erb +1 -0
  219. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/multi_provides/index.js.erb +1 -0
  220. data/spec/public/controller/display_spec.rb +84 -0
  221. data/spec/public/controller/redirect_spec.rb +27 -0
  222. data/spec/public/controller/responder_spec.rb +163 -0
  223. data/spec/public/controller/spec_helper.rb +11 -0
  224. data/spec/public/controller/url_spec.rb +180 -0
  225. data/spec/public/core/merb_core_spec.rb +45 -0
  226. data/spec/public/core_ext/class_spec.rb +91 -0
  227. data/spec/public/core_ext/fixtures/core_ext_dependency.rb +2 -0
  228. data/spec/public/core_ext/kernel_spec.rb +9 -0
  229. data/spec/public/core_ext/spec_helper.rb +1 -0
  230. data/spec/public/directory_structure/directory/app/controllers/application.rb +3 -0
  231. data/spec/public/directory_structure/directory/app/controllers/base.rb +13 -0
  232. data/spec/public/directory_structure/directory/app/controllers/custom.rb +19 -0
  233. data/spec/public/directory_structure/directory/app/views/base/template.html.erb +1 -0
  234. data/spec/public/directory_structure/directory/app/views/wonderful/template.erb +1 -0
  235. data/spec/public/directory_structure/directory/config/router.rb +3 -0
  236. data/spec/public/directory_structure/directory/log/merb_test.log +562 -0
  237. data/spec/public/directory_structure/directory_spec.rb +44 -0
  238. data/spec/public/logger/logger_spec.rb +181 -0
  239. data/spec/public/logger/spec_helper.rb +1 -0
  240. data/spec/public/reloading/directory/app/controllers/application.rb +3 -0
  241. data/spec/public/reloading/directory/app/controllers/reload.rb +6 -0
  242. data/spec/public/reloading/directory/config/init.rb +2 -0
  243. data/spec/public/reloading/directory/log/merb_test.log +138 -0
  244. data/spec/public/reloading/reload_spec.rb +103 -0
  245. data/spec/public/request/multipart_spec.rb +41 -0
  246. data/spec/public/request/request_spec.rb +228 -0
  247. data/spec/public/router/default_spec.rb +21 -0
  248. data/spec/public/router/deferred_spec.rb +22 -0
  249. data/spec/public/router/fixation_spec.rb +27 -0
  250. data/spec/public/router/fixture/log/merb_test.log +1556 -0
  251. data/spec/public/router/namespace_spec.rb +113 -0
  252. data/spec/public/router/nested_matches_spec.rb +97 -0
  253. data/spec/public/router/nested_resources_spec.rb +41 -0
  254. data/spec/public/router/resource_spec.rb +37 -0
  255. data/spec/public/router/resources_spec.rb +82 -0
  256. data/spec/public/router/spec_helper.rb +90 -0
  257. data/spec/public/router/special_spec.rb +61 -0
  258. data/spec/public/router/string_spec.rb +61 -0
  259. data/spec/public/template/template_spec.rb +104 -0
  260. data/spec/public/template/templates/error.html.erb +2 -0
  261. data/spec/public/template/templates/template.html.erb +1 -0
  262. data/spec/public/template/templates/template.html.myt +1 -0
  263. data/spec/public/test/controller_matchers_spec.rb +402 -0
  264. data/spec/public/test/controllers/controller_assertion_mock.rb +7 -0
  265. data/spec/public/test/controllers/dispatch_controller.rb +11 -0
  266. data/spec/public/test/controllers/spec_helper_controller.rb +38 -0
  267. data/spec/public/test/multipart_request_helper_spec.rb +159 -0
  268. data/spec/public/test/multipart_upload_text_file.txt +1 -0
  269. data/spec/public/test/request_helper_spec.rb +221 -0
  270. data/spec/public/test/route_helper_spec.rb +71 -0
  271. data/spec/public/test/route_matchers_spec.rb +162 -0
  272. data/spec/public/test/view_helper_spec.rb +96 -0
  273. data/spec/public/test/view_matchers_spec.rb +183 -0
  274. data/spec/spec_helper.rb +68 -0
  275. metadata +493 -41
  276. data/README.txt +0 -3
  277. data/lib/extlib.rb +0 -32
  278. data/lib/extlib/assertions.rb +0 -8
  279. data/lib/extlib/blank.rb +0 -42
  280. data/lib/extlib/class.rb +0 -175
  281. data/lib/extlib/hash.rb +0 -410
  282. data/lib/extlib/hook.rb +0 -366
  283. data/lib/extlib/inflection.rb +0 -141
  284. data/lib/extlib/lazy_array.rb +0 -106
  285. data/lib/extlib/mash.rb +0 -143
  286. data/lib/extlib/module.rb +0 -37
  287. data/lib/extlib/object.rb +0 -165
  288. data/lib/extlib/object_space.rb +0 -13
  289. data/lib/extlib/pathname.rb +0 -5
  290. data/lib/extlib/pooling.rb +0 -233
  291. data/lib/extlib/rubygems.rb +0 -38
  292. data/lib/extlib/simple_set.rb +0 -39
  293. data/lib/extlib/string.rb +0 -132
  294. data/lib/extlib/struct.rb +0 -8
  295. data/lib/extlib/tasks/release.rb +0 -9
  296. data/lib/extlib/time.rb +0 -12
  297. data/lib/extlib/version.rb +0 -3
  298. data/lib/extlib/virtual_file.rb +0 -10
@@ -0,0 +1,32 @@
1
+ module Merb
2
+ autoload :AbstractController, "merb-core/controller/abstract_controller"
3
+ autoload :BootLoader, "merb-core/bootloader"
4
+ autoload :Config, "merb-core/config"
5
+ autoload :Const, "merb-core/constants"
6
+ autoload :ControllerMixin, "merb-core/controller/mixins/controller"
7
+ autoload :ControllerExceptions, "merb-core/controller/exceptions"
8
+ autoload :Cookies, "merb-core/dispatch/cookies"
9
+ autoload :Dispatcher, "merb-core/dispatch/dispatcher"
10
+ autoload :AuthenticationMixin, "merb-core/controller/mixins/authentication"
11
+ autoload :BasicAuthenticationMixin, "merb-core/controller/mixins/authentication/basic"
12
+ autoload :ErubisCaptureMixin, "merb-core/controller/mixins/erubis_capture"
13
+ autoload :Plugins, "merb-core/plugins"
14
+ autoload :Rack, "merb-core/rack"
15
+ autoload :RenderMixin, "merb-core/controller/mixins/render"
16
+ autoload :Request, "merb-core/dispatch/request"
17
+ autoload :ResponderMixin, "merb-core/controller/mixins/responder"
18
+ autoload :Router, "merb-core/dispatch/router"
19
+ autoload :SessionMixin, "merb-core/dispatch/session"
20
+ autoload :Test, "merb-core/test"
21
+ autoload :Worker, "merb-core/dispatch/worker"
22
+ end
23
+
24
+ # Require this rather than autoloading it so we can be sure the default template
25
+ # gets registered
26
+ require 'merb-core/core_ext'
27
+ require "merb-core/controller/template"
28
+ require "merb-core/controller/merb_controller"
29
+
30
+ module Merb
31
+ module InlineTemplates; end
32
+ end
@@ -0,0 +1,708 @@
1
+ module Merb
2
+
3
+ class BootLoader
4
+
5
+ # def self.subclasses
6
+ #---
7
+ # @semipublic
8
+ cattr_accessor :subclasses, :after_load_callbacks, :before_load_callbacks, :finished
9
+ self.subclasses, self.after_load_callbacks, self.before_load_callbacks, self.finished = [], [], [], []
10
+
11
+ class << self
12
+
13
+ # Adds the inheriting class to the list of subclasses in a position
14
+ # specified by the before and after methods.
15
+ #
16
+ # ==== Parameters
17
+ # klass<Class>:: The class inheriting from Merb::BootLoader.
18
+ def inherited(klass)
19
+ subclasses << klass.to_s
20
+ super
21
+ end
22
+
23
+ # ==== Parameters
24
+ # klass<~to_s>::
25
+ # The boot loader class after which this boot loader should be run.
26
+ #
27
+ #---
28
+ # @public
29
+ def after(klass)
30
+ move_klass(klass, 1)
31
+ end
32
+
33
+ # ==== Parameters
34
+ # klass<~to_s>::
35
+ # The boot loader class before which this boot loader should be run.
36
+ #
37
+ #---
38
+ # @public
39
+ def before(klass)
40
+ move_klass(klass, 0)
41
+ end
42
+
43
+ # Move a class that is inside the bootloader to some place in the Array,
44
+ # relative to another class.
45
+ #
46
+ # ==== Parameters
47
+ # klass<~to_s>::
48
+ # The klass to move the bootloader relative to
49
+ # where<Integer>::
50
+ # 0 means insert it before; 1 means insert it after
51
+ def move_klass(klass, where)
52
+ index = Merb::BootLoader.subclasses.index(klass.to_s)
53
+ if index
54
+ Merb::BootLoader.subclasses.delete(self.to_s)
55
+ Merb::BootLoader.subclasses.insert(index + where, self.to_s)
56
+ end
57
+ end
58
+
59
+ # Runs all boot loader classes by calling their run methods.
60
+ def run
61
+ subklasses = subclasses.dup
62
+ until subclasses.empty?
63
+ time = Time.now.to_i
64
+ bootloader = subclasses.shift
65
+ if (ENV['DEBUG'] || $DEBUG || Merb::Config[:verbose]) && Merb.logger
66
+ Merb.logger.debug!("Loading: #{bootloader}")
67
+ end
68
+ Object.full_const_get(bootloader).run
69
+ if (ENV['DEBUG'] || $DEBUG || Merb::Config[:verbose]) && Merb.logger
70
+ Merb.logger.debug!("It took: #{Time.now.to_i - time}")
71
+ end
72
+ self.finished << bootloader
73
+ end
74
+ self.subclasses = subklasses
75
+ end
76
+
77
+ # Determines whether or not a specific bootloader has finished yet.
78
+ #
79
+ # ==== Parameters
80
+ # bootloader<String, Class>:: The name of the bootloader to check.
81
+ #
82
+ # ==== Returns
83
+ # Boolean:: Whether or not the bootloader has finished.
84
+ def finished?(bootloader)
85
+ self.finished.include?(bootloader.to_s)
86
+ end
87
+
88
+ # Set up the default framework
89
+ #
90
+ # ==== Returns
91
+ # nil
92
+ #
93
+ #---
94
+ # @public
95
+ def default_framework
96
+ %w[view model helper controller mailer part].each do |component|
97
+ Merb.push_path(component.to_sym, Merb.root_path("app/#{component}s"))
98
+ end
99
+ Merb.push_path(:application, Merb.root_path("app" / "controllers" / "application.rb"))
100
+ Merb.push_path(:config, Merb.root_path("config"), nil)
101
+ Merb.push_path(:router, Merb.dir_for(:config), (Merb::Config[:router_file] || "router.rb"))
102
+ Merb.push_path(:lib, Merb.root_path("lib"), nil)
103
+ Merb.push_path(:log, Merb.log_path, nil)
104
+ Merb.push_path(:public, Merb.root_path("public"), nil)
105
+ Merb.push_path(:stylesheet, Merb.dir_for(:public) / "stylesheets", nil)
106
+ Merb.push_path(:javascript, Merb.dir_for(:public) / "javascripts", nil)
107
+ Merb.push_path(:image, Merb.dir_for(:public) / "images", nil)
108
+ nil
109
+ end
110
+
111
+ # ==== Parameters
112
+ # &block::
113
+ # A block to be added to the callbacks that will be executed after the
114
+ # app loads.
115
+ #
116
+ #---
117
+ # @public
118
+ def after_app_loads(&block)
119
+ after_load_callbacks << block
120
+ end
121
+
122
+ # ==== Parameters
123
+ # &block::
124
+ # A block to be added to the callbacks that will be executed before the
125
+ # app loads.
126
+ #
127
+ #---
128
+ # @public
129
+ def before_app_loads(&block)
130
+ before_load_callbacks << block
131
+ end
132
+ end
133
+
134
+ end
135
+
136
+ end
137
+
138
+ # Set up the logger.
139
+ #
140
+ # Place the logger inside of the Merb log directory (set up in
141
+ # Merb::BootLoader::BuildFramework)
142
+ class Merb::BootLoader::Logger < Merb::BootLoader
143
+
144
+ # Sets Merb.logger to a new logger created based on the config settings.
145
+ def self.run
146
+ Merb.logger = Merb::Logger.new(Merb.log_file, Merb::Config[:log_level], Merb::Config[:log_delimiter], Merb::Config[:log_auto_flush])
147
+ print_warnings
148
+ end
149
+
150
+ def self.print_warnings
151
+ if Gem::Version.new(Gem::RubyGemsVersion) < Gem::Version.new("1.1")
152
+ Merb.logger.warn! "Merb requires Rubygems 1.1 and later. Please upgrade RubyGems with gem update --system."
153
+ end
154
+ end
155
+ end
156
+
157
+ # Stores pid file.
158
+ #
159
+ # Only run if daemonization or clustering options specified on start.
160
+ # Port is taken from Merb::Config and must be already set at this point.
161
+ class Merb::BootLoader::DropPidFile < Merb::BootLoader
162
+ class << self
163
+
164
+ # Stores a PID file if Merb is running daemonized or clustered.
165
+ def run
166
+ Merb::Server.store_pid(Merb::Config[:port]) if Merb::Config[:daemonize] || Merb::Config[:cluster]
167
+ end
168
+ end
169
+ end
170
+
171
+ # Setup some useful defaults
172
+ class Merb::BootLoader::Defaults < Merb::BootLoader
173
+ def self.run
174
+ Merb::Request.http_method_overrides.concat([
175
+ proc { |c| c.params[:_method] },
176
+ proc { |c| c.env['HTTP_X_HTTP_METHOD_OVERRIDE'] }
177
+ ])
178
+ end
179
+ end
180
+
181
+
182
+ # Build the framework paths.
183
+ #
184
+ # By default, the following paths will be used:
185
+ # application:: Merb.root/app/controller/application.rb
186
+ # config:: Merb.root/config
187
+ # lib:: Merb.root/lib
188
+ # log:: Merb.root/log
189
+ # view:: Merb.root/app/views
190
+ # model:: Merb.root/app/models
191
+ # controller:: Merb.root/app/controllers
192
+ # helper:: Merb.root/app/helpers
193
+ # mailer:: Merb.root/app/mailers
194
+ # part:: Merb.root/app/parts
195
+ #
196
+ # To override the default, set Merb::Config[:framework] in your initialization
197
+ # file. Merb::Config[:framework] takes a Hash whose key is the name of the
198
+ # path, and whose values can be passed into Merb.push_path (see Merb.push_path
199
+ # for full details).
200
+ #
201
+ # ==== Notes
202
+ # All paths will default to Merb.root, so you can get a flat-file structure by
203
+ # doing Merb::Config[:framework] = {}.
204
+ #
205
+ # ==== Example
206
+ # Merb::Config[:framework] = {
207
+ # :view => Merb.root / "views",
208
+ # :model => Merb.root / "models",
209
+ # :lib => Merb.root / "lib",
210
+ # :public => [Merb.root / "public", nil]
211
+ # :router => [Merb.root / "config", "router.rb"]
212
+ # }
213
+ #
214
+ # That will set up a flat directory structure with the config files and
215
+ # controller files under Merb.root, but with models, views, and lib with their
216
+ # own folders off of Merb.root.
217
+ class Merb::BootLoader::BuildFramework < Merb::BootLoader
218
+ class << self
219
+
220
+ # Builds the framework directory structure.
221
+ def run
222
+ build_framework
223
+ end
224
+
225
+ # This method should be overridden in init.rb before Merb.start to set up
226
+ # a different framework structure.
227
+ def build_framework
228
+ if File.exists?(Merb.root / "config" / "framework.rb")
229
+ require Merb.root / "config" / "framework"
230
+ elsif File.exists?(Merb.root / "framework.rb")
231
+ require Merb.root / "framework"
232
+ else
233
+ Merb::BootLoader.default_framework
234
+ end
235
+ (Merb::Config[:framework] || {}).each do |name, path|
236
+ path = Array(path)
237
+ Merb.push_path(name, path.first, path.length == 2 ? path[1] : "**/*.rb")
238
+ end
239
+ end
240
+ end
241
+ end
242
+
243
+ class Merb::BootLoader::Dependencies < Merb::BootLoader
244
+
245
+ cattr_accessor :dependencies
246
+ self.dependencies = []
247
+
248
+ # Load the init_file specified in Merb::Config or if not specified, the
249
+ # init.rb file from the Merb configuration directory, and any environment
250
+ # files, which register the list of necessary dependencies and any
251
+ # after_app_loads hooks.
252
+ #
253
+ # Dependencies can hook into the bootloader process itself by using
254
+ # before or after insertion methods. Since these are loaded from this
255
+ # bootloader (Dependencies), they can only adapt the bootloaders that
256
+ # haven't been loaded up until this point.
257
+
258
+ def self.run
259
+ load_initfile
260
+ load_env_config
261
+ enable_json_gem unless Merb::disabled?(:json)
262
+ load_dependencies
263
+ update_logger
264
+ end
265
+
266
+ def self.load_dependencies
267
+ dependencies.each { |name, ver| Kernel.load_dependency(name, *ver) }
268
+ end
269
+
270
+ def self.enable_json_gem
271
+ require "json/ext"
272
+ rescue LoadError
273
+ require "json/pure"
274
+ end
275
+
276
+ def self.update_logger
277
+ updated_logger_options = [ Merb.log_file, Merb::Config[:log_level], Merb::Config[:log_delimiter], Merb::Config[:log_auto_flush] ]
278
+ Merb::BootLoader::Logger.run if updated_logger_options != Merb.logger.init_args
279
+ end
280
+
281
+ private
282
+
283
+ # Determines the path for the environment configuration file
284
+ def self.env_config
285
+ Merb.dir_for(:config) / "environments" / (Merb.environment + ".rb")
286
+ end
287
+
288
+ # Checks to see whether or not an environment configuration exists
289
+ def self.env_config?
290
+ Merb.environment && File.exist?(env_config)
291
+ end
292
+
293
+ # Loads the environment configuration file, if any
294
+ def self.load_env_config
295
+ load(env_config) if env_config?
296
+ end
297
+
298
+ # Determines the init file to use, if any.
299
+ # By default Merb uses init.rb from application config directory.
300
+ def self.initfile
301
+ if Merb::Config[:init_file]
302
+ Merb::Config[:init_file].chomp(".rb") + ".rb"
303
+ else
304
+ Merb.dir_for(:config) / "init.rb"
305
+ end
306
+ end
307
+
308
+ # Loads the init file, should one exist
309
+ def self.load_initfile
310
+ load(initfile) if File.exists?(initfile)
311
+ end
312
+
313
+ end
314
+
315
+ class Merb::BootLoader::BeforeAppLoads < Merb::BootLoader
316
+
317
+ # Call any before_app_loads hooks that were registered via before_app_loads
318
+ # in any plugins.
319
+ def self.run
320
+ Merb::BootLoader.before_load_callbacks.each { |x| x.call }
321
+ end
322
+ end
323
+
324
+ # Load all classes inside the load paths.
325
+ #
326
+ # This is used in conjunction with Merb::BootLoader::ReloadClasses to track
327
+ # files that need to be reloaded, and which constants need to be removed in
328
+ # order to reload a file.
329
+ #
330
+ # This also adds the model, controller, and lib directories to the load path,
331
+ # so they can be required in order to avoid load-order issues.
332
+ class Merb::BootLoader::LoadClasses < Merb::BootLoader
333
+ LOADED_CLASSES = {}
334
+ MTIMES = {}
335
+
336
+ class << self
337
+
338
+ # Load all classes from Merb's native load paths.
339
+ def run
340
+ # Add models, controllers, helpers and lib to the load path
341
+ $LOAD_PATH.unshift Merb.dir_for(:model)
342
+ $LOAD_PATH.unshift Merb.dir_for(:controller)
343
+ $LOAD_PATH.unshift Merb.dir_for(:lib)
344
+ $LOAD_PATH.unshift Merb.dir_for(:helper)
345
+
346
+ # Load application file if it exists - for flat applications
347
+ load_file Merb.dir_for(:application) if File.file?(Merb.dir_for(:application))
348
+
349
+ # Load classes and their requirements
350
+ Merb.load_paths.each do |component, path|
351
+ next unless path.last && component != :application
352
+ load_classes(path.first / path.last)
353
+ end
354
+
355
+ Merb::Controller.send :include, Merb::GlobalHelpers
356
+ end
357
+
358
+ # ==== Parameters
359
+ # file<String>:: The file to load.
360
+ def load_file(file)
361
+ klasses = ObjectSpace.classes.dup
362
+ load file
363
+ LOADED_CLASSES[file] = ObjectSpace.classes - klasses
364
+ MTIMES[file] = File.mtime(file)
365
+ end
366
+
367
+ # Load classes from given paths - using path/glob pattern.
368
+ #
369
+ # *paths<Array>::
370
+ # Array of paths to load classes from - may contain glob pattern
371
+ def load_classes(*paths)
372
+ orphaned_classes = []
373
+ paths.flatten.each do |path|
374
+ Dir[path].each do |file|
375
+ begin
376
+ load_file file
377
+ rescue NameError => ne
378
+ orphaned_classes.unshift(file)
379
+ end
380
+ end
381
+ end
382
+ load_classes_with_requirements(orphaned_classes)
383
+ end
384
+
385
+ # ==== Parameters
386
+ # file<String>:: The file to reload.
387
+ def reload(file)
388
+ remove_classes_in_file(file) { |f| load_file(f) }
389
+ end
390
+
391
+ # Reload the router to regenerate all routes.
392
+ def reload_router!
393
+ if File.file?(router_file = Merb.dir_for(:router) / Merb.glob_for(:router))
394
+ Merb::Router.reset!
395
+ reload router_file
396
+ end
397
+ end
398
+
399
+ # ==== Parameters
400
+ # file<String>:: The file to remove classes for.
401
+ # &block:: A block to call with the file that has been removed.
402
+ def remove_classes_in_file(file, &block)
403
+ Merb.klass_hashes.each {|x| x.protect_keys!}
404
+ if klasses = LOADED_CLASSES.delete(file)
405
+ klasses.each { |klass| remove_constant(klass) unless klass.to_s =~ /Router/ }
406
+ end
407
+ yield file if block_given?
408
+ Merb.klass_hashes.each {|x| x.unprotect_keys!}
409
+ end
410
+
411
+ # ==== Parameters
412
+ # const<Class>:: The class to remove.
413
+ def remove_constant(const)
414
+ # This is to support superclasses (like AbstractController) that track
415
+ # their subclasses in a class variable. Classes that wish to use this
416
+ # functionality are required to alias it to _subclasses_list. Plugins
417
+ # for ORMs and other libraries should keep this in mind.
418
+ superklass = const
419
+ until (superklass = superklass.superclass).nil?
420
+ if superklass.respond_to?(:_subclasses_list)
421
+ superklass.send(:_subclasses_list).delete(klass)
422
+ superklass.send(:_subclasses_list).delete(klass.to_s)
423
+ end
424
+ end
425
+
426
+ parts = const.to_s.split("::")
427
+ base = parts.size == 1 ? Object : Object.full_const_get(parts[0..-2].join("::"))
428
+ object = parts[-1].to_s
429
+ begin
430
+ base.send(:remove_const, object)
431
+ Merb.logger.debug("Removed constant #{object} from #{base}")
432
+ rescue NameError
433
+ Merb.logger.debug("Failed to remove constant #{object} from #{base}")
434
+ end
435
+ end
436
+
437
+ private
438
+
439
+ # "Better loading" of classes. If a class fails to load due to a NameError
440
+ # it will be added to the failed_classes and load cycle will be repeated unless
441
+ # no classes load.
442
+ #
443
+ # ==== Parameters
444
+ # klasses<Array[Class]>:: Classes to load.
445
+ def load_classes_with_requirements(klasses)
446
+ klasses.uniq!
447
+
448
+ while klasses.size > 0
449
+ # Note size to make sure things are loading
450
+ size_at_start = klasses.size
451
+
452
+ # List of failed classes
453
+ failed_classes = []
454
+ # Map classes to exceptions
455
+ error_map = {}
456
+
457
+ klasses.each do |klass|
458
+ klasses.delete(klass)
459
+ begin
460
+ load_file klass
461
+ rescue NameError => ne
462
+ error_map[klass] = ne
463
+ failed_classes.push(klass)
464
+ end
465
+ end
466
+
467
+ # Keep list of classes unique
468
+ failed_classes.each { |k| klasses.push(k) unless klasses.include?(k) }
469
+
470
+ # Stop processing if nothing loads or if everything has loaded
471
+ if klasses.size == size_at_start && klasses.size != 0
472
+ # Write all remaining failed classes and their exceptions to the log
473
+ error_map.only(*failed_classes).each do |klass, e|
474
+ Merb.logger.fatal! "Could not load #{klass}:\n\n#{e.message} - (#{e.class})\n\n#{(e.backtrace || []).join("\n")}"
475
+ end
476
+ raise LoadError, "Could not load #{failed_classes.inspect} (see log for details)."
477
+ end
478
+ break if(klasses.size == size_at_start || klasses.size == 0)
479
+ end
480
+ end
481
+
482
+ end
483
+
484
+ end
485
+
486
+ class Merb::BootLoader::Templates < Merb::BootLoader
487
+ class << self
488
+
489
+ # Loads the templates into the Merb::InlineTemplates module.
490
+ def run
491
+ template_paths.each do |path|
492
+ Merb::Template.inline_template(File.open(path))
493
+ end
494
+ end
495
+
496
+ # ==== Returns
497
+ # Array[String]:: Template files found.
498
+ def template_paths
499
+ extension_glob = "{#{Merb::Template.template_extensions.join(',')}}"
500
+
501
+ # This gets all templates set in the controllers template roots
502
+ # We separate the two maps because most of controllers will have
503
+ # the same _template_root, so it's silly to be globbing the same
504
+ # path over and over.
505
+ controller_view_paths = []
506
+ Merb::AbstractController._abstract_subclasses.each do |klass|
507
+ next if (const = Object.full_const_get(klass))._template_root.blank?
508
+ controller_view_paths += const._template_roots.map { |pair| pair.first }
509
+ end
510
+ template_paths = controller_view_paths.uniq.compact.map { |path| Dir["#{path}/**/*.#{extension_glob}"] }
511
+
512
+ # This gets the templates that might be created outside controllers
513
+ # template roots. eg app/views/shared/*
514
+ template_paths << Dir["#{Merb.dir_for(:view)}/**/*.#{extension_glob}"] if Merb.dir_for(:view)
515
+
516
+ template_paths.flatten.compact.uniq
517
+ end
518
+ end
519
+ end
520
+
521
+ # Register the default MIME types:
522
+ #
523
+ # By default, the mime-types include:
524
+ # :all:: no transform, */*
525
+ # :yaml:: to_yaml, application/x-yaml or text/yaml
526
+ # :text:: to_text, text/plain
527
+ # :html:: to_html, text/html or application/xhtml+xml or application/html
528
+ # :xml:: to_xml, application/xml or text/xml or application/x-xml
529
+ # :js:: to_json, text/javascript ot application/javascript or application/x-javascript
530
+ # :json:: to_json, application/json or text/x-json
531
+ class Merb::BootLoader::MimeTypes < Merb::BootLoader
532
+
533
+ # Registers the default MIME types.
534
+ def self.run
535
+ Merb.add_mime_type(:all, nil, %w[*/*])
536
+ Merb.add_mime_type(:yaml, :to_yaml, %w[application/x-yaml text/yaml], :charset => "utf-8")
537
+ Merb.add_mime_type(:text, :to_text, %w[text/plain], :charset => "utf-8")
538
+ Merb.add_mime_type(:html, :to_html, %w[text/html application/xhtml+xml application/html], :charset => "utf-8")
539
+ Merb.add_mime_type(:xml, :to_xml, %w[application/xml text/xml application/x-xml], :charset => "utf-8")
540
+ Merb.add_mime_type(:js, :to_json, %w[text/javascript application/javascript application/x-javascript], :charset => "utf-8")
541
+ Merb.add_mime_type(:json, :to_json, %w[application/json text/x-json], :charset => "utf-8")
542
+ end
543
+ end
544
+
545
+ class Merb::BootLoader::AfterAppLoads < Merb::BootLoader
546
+
547
+ # Call any after_app_loads hooks that were registered via after_app_loads in
548
+ # init.rb.
549
+ def self.run
550
+ Merb::BootLoader.after_load_callbacks.each {|x| x.call }
551
+ end
552
+ end
553
+
554
+ class Merb::BootLoader::MixinSessionContainer < Merb::BootLoader
555
+
556
+ # Mixin the correct session container.
557
+ def self.run
558
+ Merb.register_session_type('memory',
559
+ Merb.framework_root / "merb-core" / "dispatch" / "session" / "memory",
560
+ "Using in-memory sessions; sessions will be lost whenever the server stops.")
561
+
562
+ Merb.register_session_type('memcache',
563
+ Merb.framework_root / "merb-core" / "dispatch" / "session" / "memcached",
564
+ "Using 'memcached' sessions")
565
+
566
+ Merb.register_session_type('cookie', # Last session type becomes the default
567
+ Merb.framework_root / "merb-core" / "dispatch" / "session" / "cookie",
568
+ "Using 'share-nothing' cookie sessions (4kb limit per client)")
569
+
570
+
571
+
572
+ Merb::Controller.class_eval do
573
+ session_store = Merb::Config[:session_store].to_s
574
+ if ["", "false", "none"].include?(session_store)
575
+ Merb.logger.warn "Not Using Sessions"
576
+ elsif reg = Merb.registered_session_types[session_store]
577
+ Merb::BootLoader::MixinSessionContainer.check_for_secret_key if session_store == "cookie"
578
+ Merb::BootLoader::MixinSessionContainer.check_for_session_id_key
579
+ require reg[:file]
580
+ include ::Merb::SessionMixin
581
+ Merb.logger.warn reg[:description]
582
+ else
583
+ Merb.logger.warn "Session store not found, '#{Merb::Config[:session_store]}'."
584
+ Merb.logger.warn "Defaulting to CookieStore Sessions"
585
+ Merb::BootLoader::MixinSessionContainer.check_for_secret_key
586
+ Merb::BootLoader::MixinSessionContainer.check_for_session_id_key
587
+ require Merb.registered_session_types['cookie'][:file]
588
+ include ::Merb::SessionMixin
589
+ Merb.logger.warn "(plugin not installed?)"
590
+ end
591
+ end
592
+
593
+ Merb.logger.flush
594
+ end
595
+
596
+ # Sets the controller session ID key if it has been set in config.
597
+ def self.check_for_session_id_key
598
+ if Merb::Config[:session_id_key]
599
+ Merb::Controller._session_id_key = Merb::Config[:session_id_key]
600
+ end
601
+ end
602
+
603
+ # Attempts to set the session secret key. This method will exit if the key
604
+ # does not exist or is shorter than 16 charaters.
605
+ def self.check_for_secret_key
606
+ unless Merb::Config[:session_secret_key] && (Merb::Config[:session_secret_key].length >= 16)
607
+ Merb.logger.warn("You must specify a session_secret_key in your init file, and it must be at least 16 characters\nbailing out...")
608
+ exit!
609
+ end
610
+ Merb::Controller._session_secret_key = Merb::Config[:session_secret_key]
611
+ end
612
+ end
613
+
614
+ class Merb::BootLoader::ChooseAdapter < Merb::BootLoader
615
+
616
+ # Choose the Rack adapter/server to use and set Merb.adapter.
617
+ def self.run
618
+ Merb.adapter = Merb::Rack::Adapter.get(Merb::Config[:adapter])
619
+ end
620
+ end
621
+
622
+ class Merb::BootLoader::StartWorkerThread < Merb::BootLoader
623
+
624
+ # Choose the Rack adapter/server to use and set Merb.adapter.
625
+ def self.run
626
+ Merb::Worker.new
627
+ end
628
+ end
629
+
630
+ class Merb::BootLoader::RackUpApplication < Merb::BootLoader
631
+ # Setup the Merb Rack App or read a rackup file located at
632
+ # Merb::Config[:rackup] with the same syntax as the
633
+ # rackup tool that comes with rack. Automatically evals the file in
634
+ # the context of a Rack::Builder.new { } block. Allows for mounting
635
+ # additional apps or middleware.
636
+ def self.run
637
+ require 'rack'
638
+ if File.exists?(Merb.dir_for(:config) / "rack.rb")
639
+ Merb::Config[:rackup] ||= Merb.dir_for(:config) / "rack.rb"
640
+ end
641
+
642
+ if Merb::Config[:rackup]
643
+ rackup_code = File.read(Merb::Config[:rackup])
644
+ Merb::Config[:app] = eval("::Rack::Builder.new {( #{rackup_code}\n )}.to_app", TOPLEVEL_BINDING, Merb::Config[:rackup])
645
+ else
646
+ Merb::Config[:app] = ::Rack::Builder.new {
647
+ if prefix = ::Merb::Config[:path_prefix]
648
+ use Merb::Rack::PathPrefix, prefix
649
+ end
650
+ use Merb::Rack::Static, Merb.dir_for(:public)
651
+ run Merb::Rack::Application.new
652
+ }.to_app
653
+ end
654
+ end
655
+ end
656
+
657
+ class Merb::BootLoader::ReloadClasses < Merb::BootLoader
658
+
659
+ class TimedExecutor
660
+ def self.every(seconds, &block)
661
+ Thread.abort_on_exception = true
662
+ Thread.new do
663
+ loop do
664
+ sleep( seconds )
665
+ block.call
666
+ end
667
+ Thread.exit
668
+ end
669
+ end
670
+ end
671
+
672
+ # Setup the class reloader if it's been specified in config.
673
+ def self.run
674
+ return unless Merb::Config[:reload_classes]
675
+
676
+ TimedExecutor.every(Merb::Config[:reload_time] || 0.5) do
677
+ reload
678
+ end
679
+
680
+ end
681
+
682
+ # Reloads all files.
683
+ def self.reload
684
+ paths = []
685
+ Merb.load_paths.each do |path_name, file_info|
686
+ path, glob = file_info
687
+ next unless glob
688
+ paths << Dir[path / glob]
689
+ end
690
+
691
+ paths << Merb.dir_for(:application) if Merb.dir_for(:application) && File.file?(Merb.dir_for(:application))
692
+
693
+ paths.flatten.each do |file|
694
+ next if Merb::BootLoader::LoadClasses::MTIMES[file] && Merb::BootLoader::LoadClasses::MTIMES[file] == File.mtime(file)
695
+ Merb::BootLoader::LoadClasses.reload(file)
696
+ end
697
+ end
698
+ end
699
+
700
+ class Merb::BootLoader::ReloadTemplates < Merb::BootLoader
701
+
702
+ # Reloads all templates if the reload_templates key has been set in config.
703
+ def self.run
704
+ unless Merb::Config.key?(:reload_templates)
705
+ Merb::Config[:reload_templates] = (Merb.environment == "development")
706
+ end
707
+ end
708
+ end