thorero 0.9.4.4 → 0.9.4.5

Sign up to get free protection for your applications and to get access to all the features.
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