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,68 @@
1
+ namespace :audit do
2
+
3
+ desc "Print out the named and anonymous routes"
4
+ task :routes => :merb_env do
5
+ seen = []
6
+ unless Merb::Router.named_routes.empty?
7
+ puts "Named Routes"
8
+ Merb::Router.named_routes.each do |name,route|
9
+ puts " #{name}: #{route}"
10
+ seen << route
11
+ end
12
+ end
13
+ puts "Anonymous Routes"
14
+ (Merb::Router.routes - seen).each do |route|
15
+ puts " #{route}"
16
+ end
17
+ nil
18
+ end
19
+
20
+ desc "Print out all controllers"
21
+ task :controllers => :merb_env do
22
+ puts "\nControllers:\n\n"
23
+ abstract_controller_classes.each do |klass|
24
+ if klass.respond_to?(:subclasses_list)
25
+ puts "#{klass} < #{klass.superclass}"
26
+ subklasses = klass.subclasses_list.sort.map { |x| Object.full_const_get(x) }
27
+ unless subklasses.empty?
28
+ subklasses.each { |subklass| puts "- #{subklass}" }
29
+ else
30
+ puts "~ no subclasses"
31
+ end
32
+ puts
33
+ end
34
+ end
35
+ end
36
+
37
+ desc "Print out controllers and their actions (use CONTROLLER=Foo,Bar to be selective)"
38
+ task :actions => :merb_env do
39
+ puts "\nControllers and their actions:\n\n"
40
+ filter_controllers = ENV['CONTROLLER'] ? ENV['CONTROLLER'].split(',') : nil
41
+ abstract_controllers = abstract_controller_classes
42
+ classes = Merb::AbstractController.subclasses_list.sort.map { |x| Object.full_const_get(x) }
43
+ classes = classes.select { |k| k.name.in?(filter_controllers) } if filter_controllers
44
+ classes.each do |subklass|
45
+ next if subklass.in?(abstract_controllers) || !subklass.respond_to?(:callable_actions)
46
+ puts "#{subklass} < #{subklass.superclass}"
47
+ unless subklass.callable_actions.empty?
48
+ subklass.callable_actions.sort.each do |action, null|
49
+ if subklass.respond_to?(:action_argument_list)
50
+ arguments, defaults = subklass.action_argument_list[action]
51
+ args = arguments.map { |name, value| value ? "#{name} = #{value.inspect}" : name.to_s }.join(', ')
52
+ puts args.empty? ? "- #{action}" : "- #{action}(#{args})"
53
+ else
54
+ puts "- #{action}"
55
+ end
56
+ end
57
+ else
58
+ puts "~ no callable actions"
59
+ end
60
+ puts
61
+ end
62
+ end
63
+
64
+ def abstract_controller_classes
65
+ ObjectSpace.classes.select { |x| x.superclass == Merb::AbstractController }.sort_by { |x| x.name }
66
+ end
67
+
68
+ end
@@ -0,0 +1 @@
1
+ Dir[File.dirname(__FILE__) / '*.rake'].each { |ext| load ext }
@@ -0,0 +1,12 @@
1
+ def sudo
2
+ ENV['MERB_SUDO'] ||= "sudo"
3
+ sudo = windows? ? "" : ENV['MERB_SUDO']
4
+ end
5
+
6
+ def windows?
7
+ (PLATFORM =~ /win32|cygwin/) rescue nil
8
+ end
9
+
10
+ def install_home
11
+ ENV['GEM_HOME'] ? "-i #{ENV['GEM_HOME']}" : ""
12
+ end
@@ -0,0 +1,11 @@
1
+ require "hpricot"
2
+
3
+ require 'merb-core/test/test_ext/hpricot'
4
+ require 'merb-core/test/test_ext/object'
5
+ require 'merb-core/test/test_ext/string'
6
+
7
+ module Merb; module Test; end; end
8
+
9
+ require 'merb-core/test/helpers'
10
+
11
+ require 'merb-core/test/matchers'
@@ -0,0 +1,9 @@
1
+ # This is a place holder to allow plugins etc a place to include
2
+ # testing helpers
3
+ module Merb::Test::Helpers; end
4
+
5
+ require "merb-core/test/helpers/request_helper"
6
+ require "merb-core/test/helpers/multipart_request_helper"
7
+ require "merb-core/test/helpers/controller_helper"
8
+ require "merb-core/test/helpers/route_helper"
9
+ require "merb-core/test/helpers/view_helper"
@@ -0,0 +1,8 @@
1
+ module Merb
2
+ module Test
3
+ module ControllerHelper
4
+ include RequestHelper
5
+ include MultipartRequestHelper
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,175 @@
1
+ module Merb::Test::MultipartRequestHelper
2
+ require 'rubygems'
3
+ require 'mime/types'
4
+
5
+ class Param
6
+ attr_accessor :key, :value
7
+
8
+ # ==== Parameters
9
+ # key<~to_s>:: The parameter key.
10
+ # value<~to_s>:: The parameter value.
11
+ def initialize(key, value)
12
+ @key = key
13
+ @value = value
14
+ end
15
+
16
+ # ==== Returns
17
+ # String:: The parameter in a form suitable for a multipart request.
18
+ def to_multipart
19
+ return %(Content-Disposition: form-data; name="#{key}"\r\n\r\n#{value}\r\n)
20
+ end
21
+ end
22
+
23
+ class FileParam
24
+ attr_accessor :key, :filename, :content
25
+
26
+ # ==== Parameters
27
+ # key<~to_s>:: The parameter key.
28
+ # filename<~to_s>:: Name of the file for this parameter.
29
+ # content<~to_s>:: Content of the file for this parameter.
30
+ def initialize(key, filename, content)
31
+ @key = key
32
+ @filename = filename
33
+ @content = content
34
+ end
35
+
36
+ # ==== Returns
37
+ # String::
38
+ # The file parameter in a form suitable for a multipart request.
39
+ def to_multipart
40
+ return %(Content-Disposition: form-data; name="#{key}"; filename="#{filename}"\r\n) + "Content-Type: #{MIME::Types.type_for(@filename)}\r\n\r\n" + content + "\r\n"
41
+ end
42
+ end
43
+
44
+ class Post
45
+ BOUNDARY = '----------0xKhTmLbOuNdArY'
46
+ CONTENT_TYPE = "multipart/form-data, boundary=" + BOUNDARY
47
+
48
+ # ==== Parameters
49
+ # params<Hash>:: Optional params for the controller.
50
+ def initialize(params = {})
51
+ @multipart_params = []
52
+ push_params(params)
53
+ end
54
+
55
+ # Saves the params in an array of multipart params as Param and
56
+ # FileParam objects.
57
+ #
58
+ # ==== Parameters
59
+ # params<Hash>:: The params to add to the multipart params.
60
+ # prefix<~to_s>:: An optional prefix for the request string keys.
61
+ def push_params(params, prefix = nil)
62
+ params.sort_by {|k| k.to_s}.each do |key, value|
63
+ param_key = prefix.nil? ? key : "#{prefix}[#{key}]"
64
+ if value.respond_to?(:read)
65
+ @multipart_params << FileParam.new(param_key, value.path, value.read)
66
+ else
67
+ if value.is_a?(Hash) || value.is_a?(Mash)
68
+ value.keys.each do |k|
69
+ push_params(value, param_key)
70
+ end
71
+ else
72
+ @multipart_params << Param.new(param_key, value)
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+ # ==== Returns
79
+ # Array[String, String]:: The query and the content type.
80
+ def to_multipart
81
+ query = @multipart_params.collect { |param| "--" + BOUNDARY + "\r\n" + param.to_multipart }.join("") + "--" + BOUNDARY + "--"
82
+ return query, CONTENT_TYPE
83
+ end
84
+ end
85
+
86
+ # Similar to dispatch_to but allows for sending files inside params.
87
+ #
88
+ # ==== Paramters
89
+ # controller_klass<Controller>::
90
+ # The controller class object that the action should be dispatched to.
91
+ # action<Symbol>:: The action name, as a symbol.
92
+ # params<Hash>::
93
+ # An optional hash that will end up as params in the controller instance.
94
+ # env<Hash>::
95
+ # An optional hash that is passed to the fake request. Any request options
96
+ # should go here (see +fake_request+).
97
+ # &blk:: The block is executed in the context of the controller.
98
+ #
99
+ # ==== Example
100
+ # dispatch_multipart_to(MyController, :create, :my_file => @a_file ) do |controller|
101
+ # controller.stub!(:current_user).and_return(@user)
102
+ # end
103
+ #
104
+ # ==== Notes
105
+ # Set your option to contain a file object to simulate file uploads.
106
+ #
107
+ # Does not use routes.
108
+ #---
109
+ # @public
110
+ def dispatch_multipart_to(controller_klass, action, params = {}, env = {}, &blk)
111
+ request = multipart_fake_request(env, params)
112
+ dispatch_request(request, controller_klass, action, &blk)
113
+ end
114
+
115
+ # An HTTP POST request that operates through the router and uses multipart
116
+ # parameters.
117
+ #
118
+ # ==== Parameters
119
+ # path<String>:: The path that should go to the router as the request uri.
120
+ # params<Hash>::
121
+ # An optional hash that will end up as params in the controller instance.
122
+ # env<Hash>::
123
+ # An optional hash that is passed to the fake request. Any request options
124
+ # should go here (see +fake_request+).
125
+ # block<Proc>:: The block is executed in the context of the controller.
126
+ #
127
+ # ==== Notes
128
+ # To include an uploaded file, put a file object as a value in params.
129
+ def multipart_post(path, params = {}, env = {}, &block)
130
+ env[:request_method] = "POST"
131
+ env[:test_with_multipart] = true
132
+ request(path, params, env, &block)
133
+ end
134
+
135
+ # An HTTP PUT request that operates through the router and uses multipart
136
+ # parameters.
137
+ #
138
+ # ==== Parameters
139
+ # path<String>:: The path that should go to the router as the request uri.
140
+ # params<Hash>::
141
+ # An optional hash that will end up as params in the controller instance.
142
+ # env<Hash>::
143
+ # An optional hash that is passed to the fake request. Any request options
144
+ # should go here (see +fake_request+).
145
+ # block<Proc>:: The block is executed in the context of the controller.
146
+ #
147
+ # ==== Notes
148
+ # To include an uplaoded file, put a file object as a value in params.
149
+ def multipart_put(path, params = {}, env = {}, &block)
150
+ env[:request_method] = "PUT"
151
+ env[:test_with_multipart] = true
152
+ request(path, params, env, &block)
153
+ end
154
+
155
+ # ==== Parameters
156
+ # env<Hash>::
157
+ # An optional hash that is passed to the fake request. Any request options
158
+ # should go here (see +fake_request+).
159
+ # params<Hash>::
160
+ # An optional hash that will end up as params in the controller instance.
161
+ #
162
+ # ==== Returns
163
+ # FakeRequest::
164
+ # A multipart Request object that is built based on the parameters.
165
+ def multipart_fake_request(env = {}, params = {})
166
+ if params.empty?
167
+ fake_request(env)
168
+ else
169
+ m = Post.new(params)
170
+ body, head = m.to_multipart
171
+ fake_request(env.merge( :content_type => head,
172
+ :content_length => body.length), :post_body => body)
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,344 @@
1
+ require 'tempfile'
2
+
3
+ module Merb
4
+ module Test
5
+ module RequestHelper
6
+ # FakeRequest sets up a default enviroment which can be overridden either
7
+ # by passing and env into initialize or using request['HTTP_VAR'] = 'foo'
8
+ class FakeRequest < Request
9
+
10
+ # ==== Parameters
11
+ # env<Hash>:: Environment options that override the defaults.
12
+ # req<StringIO>:: The request to set as input for Rack.
13
+ def initialize(env = {}, req = StringIO.new)
14
+ env.environmentize_keys!
15
+ env['rack.input'] = req
16
+ super(DEFAULT_ENV.merge(env))
17
+ end
18
+
19
+ private
20
+ DEFAULT_ENV = Mash.new({
21
+ 'SERVER_NAME' => 'localhost',
22
+ 'PATH_INFO' => '/',
23
+ 'HTTP_ACCEPT_ENCODING' => 'gzip,deflate',
24
+ 'HTTP_USER_AGENT' => 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.0.1) Gecko/20060214 Camino/1.0',
25
+ 'SCRIPT_NAME' => '/',
26
+ 'SERVER_PROTOCOL' => 'HTTP/1.1',
27
+ 'HTTP_CACHE_CONTROL' => 'max-age=0',
28
+ 'HTTP_ACCEPT_LANGUAGE' => 'en,ja;q=0.9,fr;q=0.9,de;q=0.8,es;q=0.7,it;q=0.7,nl;q=0.6,sv;q=0.5,nb;q=0.5,da;q=0.4,fi;q=0.3,pt;q=0.3,zh-Hans;q=0.2,zh-Hant;q=0.1,ko;q=0.1',
29
+ 'HTTP_HOST' => 'localhost',
30
+ 'REMOTE_ADDR' => '127.0.0.1',
31
+ 'SERVER_SOFTWARE' => 'Mongrel 1.1',
32
+ 'HTTP_KEEP_ALIVE' => '300',
33
+ 'HTTP_REFERER' => 'http://localhost/',
34
+ 'HTTP_ACCEPT_CHARSET' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
35
+ 'HTTP_VERSION' => 'HTTP/1.1',
36
+ 'REQUEST_URI' => '/',
37
+ 'SERVER_PORT' => '80',
38
+ 'GATEWAY_INTERFACE' => 'CGI/1.2',
39
+ 'HTTP_ACCEPT' => 'text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5',
40
+ 'HTTP_CONNECTION' => 'keep-alive',
41
+ 'REQUEST_METHOD' => 'GET'
42
+ }) unless defined?(DEFAULT_ENV)
43
+ end
44
+
45
+ # ==== Parameters
46
+ # env<Hash>:: A hash of environment keys to be merged into the default list.
47
+ # opt<Hash>:: A hash of options (see below).
48
+ #
49
+ # ==== Options (opt)
50
+ # :post_body<String>:: The post body for the request.
51
+ # :req<String>::
52
+ # The request string. This will only be used if :post_body is left out.
53
+ #
54
+ # ==== Returns
55
+ # FakeRequest:: A Request object that is built based on the parameters.
56
+ #
57
+ # ==== Notes
58
+ # If you pass a post body, the content-type will be set to URL-encoded.
59
+ #
60
+ #---
61
+ # @public
62
+ def fake_request(env = {}, opt = {})
63
+ if opt[:post_body]
64
+ req = opt[:post_body]
65
+ env[:content_type] ||= "application/x-www-form-urlencoded"
66
+ else
67
+ req = opt[:req]
68
+ end
69
+ FakeRequest.new(env, StringIO.new(req || ''))
70
+ end
71
+
72
+ # Dispatches an action to the given class. This bypasses the router and is
73
+ # suitable for unit testing of controllers.
74
+ #
75
+ # ==== Parameters
76
+ # controller_klass<Controller>::
77
+ # The controller class object that the action should be dispatched to.
78
+ # action<Symbol>:: The action name, as a symbol.
79
+ # params<Hash>::
80
+ # An optional hash that will end up as params in the controller instance.
81
+ # env<Hash>::
82
+ # An optional hash that is passed to the fake request. Any request options
83
+ # should go here (see +fake_request+), including :req or :post_body
84
+ # for setting the request body itself.
85
+ # &blk::
86
+ # The controller is yielded to the block provided for actions *prior* to
87
+ # the action being dispatched.
88
+ #
89
+ # ==== Example
90
+ # dispatch_to(MyController, :create, :name => 'Homer' ) do |controller|
91
+ # controller.stub!(:current_user).and_return(@user)
92
+ # end
93
+ #
94
+ # ==== Notes
95
+ # Does not use routes.
96
+ #
97
+ #---
98
+ # @public
99
+ def dispatch_to(controller_klass, action, params = {}, env = {}, &blk)
100
+ dispatch_request(build_request(params, env), controller_klass, action.to_s, &blk)
101
+ end
102
+
103
+
104
+ # Dispatches an action to the given class and using HTTP Basic Authentication
105
+ # This bypasses the router and is suitable for unit testing of controllers.
106
+ #
107
+ # ==== Parameters
108
+ # controller_klass<Controller>::
109
+ # The controller class object that the action should be dispatched to.
110
+ # action<Symbol>:: The action name, as a symbol.
111
+ # username<String>:: The username.
112
+ # password<String>:: The password.
113
+ # params<Hash>::
114
+ # An optional hash that will end up as params in the controller instance.
115
+ # env<Hash>::
116
+ # An optional hash that is passed to the fake request. Any request options
117
+ # should go here (see +fake_request+), including :req or :post_body
118
+ # for setting the request body itself.
119
+ # &blk::
120
+ # The controller is yielded to the block provided for actions *prior* to
121
+ # the action being dispatched.
122
+ #
123
+ # ==== Example
124
+ # dispatch_with_basic_authentication_to(MyController, :create, 'Fred', 'secret', :name => 'Homer' ) do |controller|
125
+ # controller.stub!(:current_user).and_return(@user)
126
+ # end
127
+ #
128
+ # ==== Notes
129
+ # Does not use routes.
130
+ #
131
+ #---
132
+ # @public
133
+ def dispatch_with_basic_authentication_to(controller_klass, action, username, password, params = {}, env = {}, &blk)
134
+ env["X_HTTP_AUTHORIZATION"] = "Basic #{Base64.encode64("#{username}:#{password}")}"
135
+
136
+ dispatch_request(build_request(params, env), controller_klass, action.to_s, &blk)
137
+ end
138
+
139
+ # Prepares and returns a request suitable for dispatching with
140
+ # dispatch_request. If you don't need to modify the request
141
+ # object before dispatching (e.g. to add cookies), you probably
142
+ # want to use dispatch_to instead.
143
+ #
144
+ # ==== Parameters
145
+ # params<Hash>::
146
+ # An optional hash that will end up as params in the controller instance.
147
+ # env<Hash>::
148
+ # An optional hash that is passed to the fake request. Any request options
149
+ # should go here (see +fake_request+), including :req or :post_body
150
+ # for setting the request body itself.
151
+ #
152
+ # ==== Example
153
+ # req = build_request(:id => 1)
154
+ # req.cookies['app_cookie'] = "testing"
155
+ # dispatch_request(req, MyController, :edit)
156
+ #
157
+ # ==== Notes
158
+ # Does not use routes.
159
+ #
160
+ #---
161
+ # @public
162
+ def build_request(params = {}, env = {})
163
+ params = Merb::Request.params_to_query_string(params)
164
+ env[:query_string] = env["QUERY_STRING"] ? "#{env["QUERY_STRING"]}&#{params}" : params
165
+
166
+ fake_request(env, { :post_body => env[:post_body], :req => env[:req] })
167
+ end
168
+
169
+ # An HTTP GET request that operates through the router.
170
+ #
171
+ # ==== Parameters
172
+ # path<String>:: The path that should go to the router as the request uri.
173
+ # params<Hash>::
174
+ # An optional hash that will end up as params in the controller instance.
175
+ # env<Hash>::
176
+ # An optional hash that is passed to the fake request. Any request options
177
+ # should go here (see +fake_request+).
178
+ # &blk::
179
+ # The controller is yielded to the block provided for actions *prior* to
180
+ # the action being dispatched.
181
+ #---
182
+ # @public
183
+ def get(path, params = {}, env = {}, &block)
184
+ env[:request_method] = "GET"
185
+ request(path, params, env, &block)
186
+ end
187
+
188
+ # An HTTP POST request that operates through the router.
189
+ #
190
+ # ==== Parameters
191
+ # path<String>:: The path that should go to the router as the request uri.
192
+ # params<Hash>::
193
+ # An optional hash that will end up as params in the controller instance.
194
+ # env<Hash>::
195
+ # An optional hash that is passed to the fake request. Any request options
196
+ # should go here (see fake_request).
197
+ # &blk::
198
+ # The controller is yielded to the block provided for actions *prior* to
199
+ # the action being dispatched.
200
+ #---
201
+ # @public
202
+ def post(path, params = {}, env = {}, &block)
203
+ env[:request_method] = "POST"
204
+ request(path, params, env, &block)
205
+ end
206
+
207
+ # An HTTP PUT request that operates through the router.
208
+ #
209
+ # ==== Parameters
210
+ # path<String>:: The path that should go to the router as the request uri.
211
+ # params<Hash>::
212
+ # An optional hash that will end up as params in the controller instance.
213
+ # env<Hash>::
214
+ # An optional hash that is passed to the fake request. Any request options
215
+ # should go here (see fake_request).
216
+ # &blk::
217
+ # The controller is yielded to the block provided for actions *prior* to
218
+ # the action being dispatched.
219
+ #---
220
+ # @public
221
+ def put(path, params = {}, env = {}, &block)
222
+ env[:request_method] = "PUT"
223
+ request(path, params, env, &block)
224
+ end
225
+
226
+ # An HTTP DELETE request that operates through the router
227
+ #
228
+ # ==== Parameters
229
+ # path<String>:: The path that should go to the router as the request uri.
230
+ # params<Hash>::
231
+ # An optional hash that will end up as params in the controller instance.
232
+ # env<Hash>::
233
+ # An optional hash that is passed to the fake request. Any request options
234
+ # should go here (see fake_request).
235
+ # &blk::
236
+ # The controller is yielded to the block provided for actions *prior* to
237
+ # the action being dispatched.
238
+ #---
239
+ # @public
240
+ def delete(path, params = {}, env = {}, &block)
241
+ env[:request_method] = "DELETE"
242
+ request(path, params, env, &block)
243
+ end
244
+
245
+ # A generic request that checks the router for the controller and action.
246
+ # This request goes through the Merb::Router and finishes at the controller.
247
+ #
248
+ # ==== Parameters
249
+ # path<String>:: The path that should go to the router as the request uri.
250
+ # params<Hash>::
251
+ # An optional hash that will end up as params in the controller instance.
252
+ # env<Hash>::
253
+ # An optional hash that is passed to the fake request. Any request options
254
+ # should go here (see +fake_request+).
255
+ # &blk::
256
+ # The controller is yielded to the block provided for actions *prior* to
257
+ # the action being dispatched.
258
+ #
259
+ # ==== Example
260
+ # request(path, { :name => 'Homer' }, { :request_method => "PUT" }) do |controller|
261
+ # controller.stub!(:current_user).and_return(@user)
262
+ # end
263
+ #
264
+ # ==== Notes
265
+ # Uses Routes.
266
+ #
267
+ #---
268
+ # @semi-public
269
+ def request(path, params = {}, env= {}, &block)
270
+ env[:request_method] ||= "GET"
271
+ env[:request_uri], env[:query_string] = path.split('?')
272
+
273
+ multipart = env.delete(:test_with_multipart)
274
+
275
+ request = fake_request(env)
276
+
277
+ opts = check_request_for_route(request) # Check that the request will be routed correctly
278
+ controller_name = (opts[:namespace] ? opts.delete(:namespace) + '/' : '') + opts.delete(:controller)
279
+ klass = Object.full_const_get(controller_name.snake_case.to_const_string)
280
+
281
+ action = opts.delete(:action).to_s
282
+ params.merge!(opts)
283
+
284
+ multipart.nil? ? dispatch_to(klass, action, params, env, &block) : dispatch_multipart_to(klass, action, params, env, &block)
285
+ end
286
+
287
+
288
+ # The workhorse for the dispatch*to helpers.
289
+ #
290
+ # ==== Parameters
291
+ # request<Merb::Test::FakeRequest, Merb::Request>::
292
+ # A request object that has been setup for testing.
293
+ # controller_klass<Merb::Controller>::
294
+ # The class object off the controller to dispatch the action to.
295
+ # action<Symbol>:: The action to dispatch the request to.
296
+ # &blk::
297
+ # The controller is yielded to the block provided for actions *prior* to
298
+ # the action being dispatched.
299
+ #
300
+ # ==== Returns
301
+ # An instance of +controller_klass+ based on the parameters.
302
+ #
303
+ # ==== Notes
304
+ # Does not use routes.
305
+ #
306
+ #---
307
+ # @public
308
+ def dispatch_request(request, controller_klass, action, &blk)
309
+ controller = controller_klass.new(request)
310
+ yield controller if block_given?
311
+ controller._dispatch(action)
312
+
313
+ Merb.logger.info controller._benchmarks.inspect
314
+ Merb.logger.flush
315
+
316
+ controller
317
+ end
318
+
319
+ # Checks to see that a request is routable.
320
+ #
321
+ # ==== Parameters
322
+ # request<Merb::Test::FakeRequest, Merb::Request>::
323
+ # The request object to inspect.
324
+ #
325
+ # ==== Raises
326
+ # Merb::ControllerExceptions::BadRequest::
327
+ # No matching route was found.
328
+ #
329
+ # ==== Returns
330
+ # Hash:: The parameters built based on the matching route.
331
+ #
332
+ #---
333
+ # @semi-public
334
+ def check_request_for_route(request)
335
+ match = ::Merb::Router.match(request)
336
+ if match[0].nil? && match[1].empty?
337
+ raise ::Merb::ControllerExceptions::BadRequest, "No routes match the request"
338
+ else
339
+ match[1]
340
+ end
341
+ end # check_request_for_route
342
+ end # RequestHelper
343
+ end # Test
344
+ end # Merb