merb-core 0.9.7 → 0.9.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (274) hide show
  1. data/CHANGELOG +136 -2
  2. data/CONTRIBUTORS +6 -0
  3. data/PUBLIC_CHANGELOG +38 -0
  4. data/Rakefile +38 -30
  5. data/lib/merb-core.rb +88 -23
  6. data/lib/merb-core/bootloader.rb +235 -51
  7. data/lib/merb-core/config.rb +121 -36
  8. data/lib/merb-core/controller/abstract_controller.rb +59 -36
  9. data/lib/merb-core/controller/exceptions.rb +2 -15
  10. data/lib/merb-core/controller/merb_controller.rb +44 -1
  11. data/lib/merb-core/controller/mime.rb +4 -0
  12. data/lib/merb-core/controller/mixins/controller.rb +38 -21
  13. data/lib/merb-core/controller/mixins/render.rb +44 -29
  14. data/lib/merb-core/controller/mixins/responder.rb +3 -31
  15. data/lib/merb-core/controller/template.rb +45 -21
  16. data/lib/merb-core/core_ext/kernel.rb +60 -32
  17. data/lib/merb-core/dispatch/default_exception/default_exception.rb +2 -2
  18. data/lib/merb-core/dispatch/default_exception/views/_css.html.erb +3 -1
  19. data/lib/merb-core/dispatch/default_exception/views/_javascript.html.erb +71 -67
  20. data/lib/merb-core/dispatch/default_exception/views/index.html.erb +7 -3
  21. data/lib/merb-core/dispatch/dispatcher.rb +3 -3
  22. data/lib/merb-core/dispatch/request.rb +56 -9
  23. data/lib/merb-core/dispatch/router.rb +159 -133
  24. data/lib/merb-core/dispatch/router/behavior.rb +462 -703
  25. data/lib/merb-core/dispatch/router/cached_proc.rb +3 -3
  26. data/lib/merb-core/dispatch/router/resources.rb +289 -0
  27. data/lib/merb-core/dispatch/router/route.rb +514 -294
  28. data/lib/merb-core/dispatch/session.rb +4 -2
  29. data/lib/merb-core/logger.rb +213 -202
  30. data/lib/merb-core/plugins.rb +9 -1
  31. data/lib/merb-core/rack.rb +3 -1
  32. data/lib/merb-core/rack/adapter.rb +7 -4
  33. data/lib/merb-core/rack/adapter/abstract.rb +188 -0
  34. data/lib/merb-core/rack/adapter/ebb.rb +12 -13
  35. data/lib/merb-core/rack/adapter/evented_mongrel.rb +2 -15
  36. data/lib/merb-core/rack/adapter/irb.rb +3 -2
  37. data/lib/merb-core/rack/adapter/mongrel.rb +22 -15
  38. data/lib/merb-core/rack/adapter/swiftiplied_mongrel.rb +4 -16
  39. data/lib/merb-core/rack/adapter/thin.rb +21 -22
  40. data/lib/merb-core/rack/adapter/thin_turbo.rb +4 -11
  41. data/lib/merb-core/rack/adapter/webrick.rb +54 -18
  42. data/lib/merb-core/rack/application.rb +4 -4
  43. data/lib/merb-core/rack/handler/mongrel.rb +12 -13
  44. data/lib/merb-core/rack/middleware/csrf.rb +1 -1
  45. data/lib/merb-core/rack/stream_wrapper.rb +41 -0
  46. data/lib/merb-core/server.rb +157 -90
  47. data/lib/merb-core/tasks/gem_management.rb +267 -0
  48. data/lib/merb-core/tasks/merb.rb +1 -0
  49. data/lib/merb-core/tasks/merb_rake_helper.rb +48 -34
  50. data/lib/merb-core/tasks/stats.rake +1 -1
  51. data/lib/merb-core/test.rb +9 -3
  52. data/lib/merb-core/test/helpers.rb +1 -0
  53. data/lib/merb-core/test/helpers/mock_request_helper.rb +393 -0
  54. data/lib/merb-core/test/helpers/multipart_request_helper.rb +3 -2
  55. data/lib/merb-core/test/helpers/request_helper.rb +40 -372
  56. data/lib/merb-core/test/helpers/route_helper.rb +16 -2
  57. data/lib/merb-core/test/matchers.rb +1 -0
  58. data/lib/merb-core/test/matchers/controller_matchers.rb +4 -247
  59. data/lib/merb-core/test/matchers/request_matchers.rb +140 -0
  60. data/lib/merb-core/test/matchers/view_matchers.rb +22 -4
  61. data/lib/merb-core/test/run_specs.rb +118 -26
  62. data/lib/merb-core/test/test_ext/rspec.rb +181 -0
  63. data/lib/merb-core/version.rb +1 -9
  64. metadata +10 -342
  65. data/docs/bootloading.dox +0 -58
  66. data/docs/documentation_standards +0 -40
  67. data/docs/merb-core-call-stack-diagram.mmap +0 -0
  68. data/docs/merb-core-call-stack-diagram.pdf +0 -0
  69. data/docs/merb-core-call-stack-diagram.png +0 -0
  70. data/docs/new_render_api +0 -51
  71. data/lib/merb-core/vendor/facets.rb +0 -2
  72. data/lib/merb-core/vendor/facets/dictionary.rb +0 -433
  73. data/lib/merb-core/vendor/facets/inflect.rb +0 -342
  74. data/spec/private/config/adapter_spec.rb +0 -32
  75. data/spec/private/config/config_spec.rb +0 -202
  76. data/spec/private/config/environment_spec.rb +0 -13
  77. data/spec/private/config/merb_spec.rb +0 -34
  78. data/spec/private/config/spec_helper.rb +0 -1
  79. data/spec/private/core_ext/kernel_spec.rb +0 -159
  80. data/spec/private/dispatch/bootloader_spec.rb +0 -24
  81. data/spec/private/dispatch/fixture/app/controllers/application.rb +0 -4
  82. data/spec/private/dispatch/fixture/app/controllers/exceptions.rb +0 -25
  83. data/spec/private/dispatch/fixture/app/controllers/foo.rb +0 -19
  84. data/spec/private/dispatch/fixture/app/helpers/global_helpers.rb +0 -8
  85. data/spec/private/dispatch/fixture/app/views/exeptions/client_error.html.erb +0 -37
  86. data/spec/private/dispatch/fixture/app/views/exeptions/internal_server_error.html.erb +0 -216
  87. data/spec/private/dispatch/fixture/app/views/exeptions/not_acceptable.html.erb +0 -38
  88. data/spec/private/dispatch/fixture/app/views/exeptions/not_found.html.erb +0 -40
  89. data/spec/private/dispatch/fixture/app/views/foo/bar.html.erb +0 -0
  90. data/spec/private/dispatch/fixture/app/views/layout/application.html.erb +0 -11
  91. data/spec/private/dispatch/fixture/config/black_hole.rb +0 -12
  92. data/spec/private/dispatch/fixture/config/environments/development.rb +0 -6
  93. data/spec/private/dispatch/fixture/config/environments/production.rb +0 -5
  94. data/spec/private/dispatch/fixture/config/environments/test.rb +0 -6
  95. data/spec/private/dispatch/fixture/config/init.rb +0 -45
  96. data/spec/private/dispatch/fixture/config/rack.rb +0 -11
  97. data/spec/private/dispatch/fixture/config/router.rb +0 -35
  98. data/spec/private/dispatch/fixture/log/merb_test.log +0 -8839
  99. data/spec/private/dispatch/fixture/public/images/merb.jpg +0 -0
  100. data/spec/private/dispatch/fixture/public/merb.fcgi +0 -4
  101. data/spec/private/dispatch/fixture/public/stylesheets/master.css +0 -119
  102. data/spec/private/dispatch/route_params_spec.rb +0 -23
  103. data/spec/private/dispatch/spec_helper.rb +0 -1
  104. data/spec/private/router/behavior_spec.rb +0 -60
  105. data/spec/private/router/fixture/log/merb_test.log +0 -35
  106. data/spec/private/router/route_spec.rb +0 -418
  107. data/spec/private/router/router_spec.rb +0 -183
  108. data/spec/private/vendor/facets/plural_spec.rb +0 -564
  109. data/spec/private/vendor/facets/singular_spec.rb +0 -489
  110. data/spec/public/DEFINITIONS +0 -11
  111. data/spec/public/abstract_controller/controllers/alt_views/layout/application.erb +0 -1
  112. data/spec/public/abstract_controller/controllers/alt_views/layout/merb/test/fixtures/abstract/render_string_controller_layout.erb +0 -1
  113. data/spec/public/abstract_controller/controllers/alt_views/layout/merb/test/fixtures/abstract/render_template_controller_layout.erb +0 -1
  114. data/spec/public/abstract_controller/controllers/alt_views/merb/test/fixtures/abstract/display_object_with_multiple_roots/index.erb +0 -1
  115. data/spec/public/abstract_controller/controllers/alt_views/merb/test/fixtures/abstract/display_object_with_multiple_roots/show.erb +0 -1
  116. data/spec/public/abstract_controller/controllers/alt_views/merb/test/fixtures/abstract/render_template_multiple_roots/index.erb +0 -1
  117. data/spec/public/abstract_controller/controllers/alt_views/partial/basic_partial_with_multiple_roots/_partial.erb +0 -1
  118. data/spec/public/abstract_controller/controllers/alt_views/render_template_multiple_roots_and_custom_location/index.erb +0 -1
  119. data/spec/public/abstract_controller/controllers/alt_views/render_template_multiple_roots_inherited/index.erb +0 -1
  120. data/spec/public/abstract_controller/controllers/cousins.rb +0 -41
  121. data/spec/public/abstract_controller/controllers/display.rb +0 -60
  122. data/spec/public/abstract_controller/controllers/filters.rb +0 -260
  123. data/spec/public/abstract_controller/controllers/helpers.rb +0 -41
  124. data/spec/public/abstract_controller/controllers/partial.rb +0 -121
  125. data/spec/public/abstract_controller/controllers/render.rb +0 -113
  126. data/spec/public/abstract_controller/controllers/views/helpers/capture/index.erb +0 -1
  127. data/spec/public/abstract_controller/controllers/views/helpers/capture_eq/index.erb +0 -1
  128. data/spec/public/abstract_controller/controllers/views/helpers/capture_with_args/index.erb +0 -1
  129. data/spec/public/abstract_controller/controllers/views/helpers/concat/index.erb +0 -1
  130. data/spec/public/abstract_controller/controllers/views/layout/alt.erb +0 -1
  131. data/spec/public/abstract_controller/controllers/views/layout/custom.erb +0 -1
  132. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/display_object/index.erb +0 -1
  133. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/display_object_with_action/new.erb +0 -1
  134. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template/index.erb +0 -1
  135. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_app_layout/index.erb +0 -0
  136. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_custom_layout/index.erb +0 -1
  137. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_multiple_roots/index.erb +0 -1
  138. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_multiple_roots/show.erb +0 -1
  139. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_two_throw_contents/index.erb +0 -1
  140. data/spec/public/abstract_controller/controllers/views/partial/another_directory/_partial.erb +0 -1
  141. data/spec/public/abstract_controller/controllers/views/partial/basic_partial/_partial.erb +0 -1
  142. data/spec/public/abstract_controller/controllers/views/partial/basic_partial/index.erb +0 -1
  143. data/spec/public/abstract_controller/controllers/views/partial/basic_partial_with_multiple_roots/index.erb +0 -1
  144. data/spec/public/abstract_controller/controllers/views/partial/nested_partial/_first.erb +0 -1
  145. data/spec/public/abstract_controller/controllers/views/partial/nested_partial/_second.erb +0 -1
  146. data/spec/public/abstract_controller/controllers/views/partial/nested_partial/index.erb +0 -1
  147. data/spec/public/abstract_controller/controllers/views/partial/partial_in_another_directory/index.erb +0 -1
  148. data/spec/public/abstract_controller/controllers/views/partial/partial_with_both/_collection.erb +0 -1
  149. data/spec/public/abstract_controller/controllers/views/partial/partial_with_both/index.erb +0 -1
  150. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections/_collection.erb +0 -1
  151. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections/index.erb +0 -1
  152. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_as/_collection.erb +0 -1
  153. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_as/index.erb +0 -1
  154. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_counter/_collection.erb +0 -1
  155. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_counter/index.erb +0 -1
  156. data/spec/public/abstract_controller/controllers/views/partial/partial_with_locals/_variables.erb +0 -1
  157. data/spec/public/abstract_controller/controllers/views/partial/partial_with_locals/index.erb +0 -1
  158. data/spec/public/abstract_controller/controllers/views/partial/partial_with_with_and_locals/_both.erb +0 -1
  159. data/spec/public/abstract_controller/controllers/views/partial/partial_with_with_and_locals/index.erb +0 -1
  160. data/spec/public/abstract_controller/controllers/views/partial/with_absolute_partial/_partial.erb +0 -1
  161. data/spec/public/abstract_controller/controllers/views/partial/with_absolute_partial/index.erb +0 -1
  162. data/spec/public/abstract_controller/controllers/views/partial/with_as_partial/_with_partial.erb +0 -1
  163. data/spec/public/abstract_controller/controllers/views/partial/with_as_partial/index.erb +0 -1
  164. data/spec/public/abstract_controller/controllers/views/partial/with_nil_partial/_with_partial.erb +0 -1
  165. data/spec/public/abstract_controller/controllers/views/partial/with_nil_partial/index.erb +0 -1
  166. data/spec/public/abstract_controller/controllers/views/partial/with_partial/_with_partial.erb +0 -1
  167. data/spec/public/abstract_controller/controllers/views/partial/with_partial/index.erb +0 -1
  168. data/spec/public/abstract_controller/controllers/views/test_display/foo.html.erb +0 -1
  169. data/spec/public/abstract_controller/controllers/views/test_render/foo.html.erb +0 -0
  170. data/spec/public/abstract_controller/controllers/views/wonderful/index.erb +0 -1
  171. data/spec/public/abstract_controller/display_spec.rb +0 -37
  172. data/spec/public/abstract_controller/filter_spec.rb +0 -136
  173. data/spec/public/abstract_controller/helper_spec.rb +0 -21
  174. data/spec/public/abstract_controller/partial_spec.rb +0 -61
  175. data/spec/public/abstract_controller/render_spec.rb +0 -90
  176. data/spec/public/abstract_controller/spec_helper.rb +0 -31
  177. data/spec/public/boot_loader/boot_loader_spec.rb +0 -33
  178. data/spec/public/boot_loader/spec_helper.rb +0 -1
  179. data/spec/public/controller/authentication_spec.rb +0 -174
  180. data/spec/public/controller/base_spec.rb +0 -88
  181. data/spec/public/controller/conditional_get_spec.rb +0 -100
  182. data/spec/public/controller/config/init.rb +0 -6
  183. data/spec/public/controller/controllers/authentication.rb +0 -74
  184. data/spec/public/controller/controllers/base.rb +0 -65
  185. data/spec/public/controller/controllers/conditional_get.rb +0 -35
  186. data/spec/public/controller/controllers/cookies.rb +0 -36
  187. data/spec/public/controller/controllers/dispatcher.rb +0 -35
  188. data/spec/public/controller/controllers/display.rb +0 -118
  189. data/spec/public/controller/controllers/redirect.rb +0 -36
  190. data/spec/public/controller/controllers/responder.rb +0 -93
  191. data/spec/public/controller/controllers/url.rb +0 -7
  192. data/spec/public/controller/controllers/views/layout/custom.html.erb +0 -1
  193. data/spec/public/controller/controllers/views/layout/custom_arg.html.erb +0 -1
  194. data/spec/public/controller/controllers/views/layout/custom_arg.json.erb +0 -1
  195. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_and_local_provides/index.html.erb +0 -1
  196. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_and_local_provides/index.xml.erb +0 -1
  197. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_provides/index.html.erb +0 -1
  198. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_provides/index.xml.erb +0 -1
  199. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template/index.html.erb +0 -1
  200. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template/no_layout.html.erb +0 -1
  201. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template_argument/index.html.erb +0 -1
  202. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/html_default/index.html.erb +0 -1
  203. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/layout/custom.html.erb +0 -1
  204. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/local_provides/index.html.erb +0 -1
  205. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/local_provides/index.xml.erb +0 -1
  206. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/multi_provides/index.html.erb +0 -1
  207. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/multi_provides/index.js.erb +0 -1
  208. data/spec/public/controller/cookies_spec.rb +0 -95
  209. data/spec/public/controller/dispatcher_spec.rb +0 -410
  210. data/spec/public/controller/display_spec.rb +0 -84
  211. data/spec/public/controller/redirect_spec.rb +0 -33
  212. data/spec/public/controller/responder_spec.rb +0 -169
  213. data/spec/public/controller/spec_helper.rb +0 -13
  214. data/spec/public/controller/url_spec.rb +0 -255
  215. data/spec/public/core/merb_core_spec.rb +0 -45
  216. data/spec/public/core_ext/fixtures/core_ext_dependency.rb +0 -2
  217. data/spec/public/core_ext/kernel_spec.rb +0 -88
  218. data/spec/public/core_ext/spec_helper.rb +0 -1
  219. data/spec/public/directory_structure/directory/app/controllers/application.rb +0 -3
  220. data/spec/public/directory_structure/directory/app/controllers/base.rb +0 -13
  221. data/spec/public/directory_structure/directory/app/controllers/custom.rb +0 -19
  222. data/spec/public/directory_structure/directory/app/views/base/template.html.erb +0 -1
  223. data/spec/public/directory_structure/directory/app/views/wonderful/template.erb +0 -1
  224. data/spec/public/directory_structure/directory/config/router.rb +0 -3
  225. data/spec/public/directory_structure/directory/log/merb_test.log +0 -4588
  226. data/spec/public/directory_structure/directory_spec.rb +0 -43
  227. data/spec/public/logger/logger_spec.rb +0 -181
  228. data/spec/public/logger/spec_helper.rb +0 -1
  229. data/spec/public/rack/conditinal_get_middleware_spec.rb +0 -127
  230. data/spec/public/rack/csrf_middleware_spec.rb +0 -70
  231. data/spec/public/rack/rack_middleware_spec.rb +0 -99
  232. data/spec/public/rack/shared_example_groups.rb +0 -35
  233. data/spec/public/reloading/directory/app/controllers/application.rb +0 -3
  234. data/spec/public/reloading/directory/app/controllers/reload.rb +0 -6
  235. data/spec/public/reloading/directory/config/init.rb +0 -2
  236. data/spec/public/reloading/directory/log/merb_test.log +0 -288231
  237. data/spec/public/reloading/reload_spec.rb +0 -103
  238. data/spec/public/request/multipart_spec.rb +0 -41
  239. data/spec/public/request/request_spec.rb +0 -250
  240. data/spec/public/router/default_spec.rb +0 -21
  241. data/spec/public/router/deferred_spec.rb +0 -22
  242. data/spec/public/router/fixation_spec.rb +0 -49
  243. data/spec/public/router/fixture/log/merb_test.log +0 -524
  244. data/spec/public/router/namespace_spec.rb +0 -113
  245. data/spec/public/router/nested_matches_spec.rb +0 -97
  246. data/spec/public/router/nested_resources_spec.rb +0 -41
  247. data/spec/public/router/resource_spec.rb +0 -37
  248. data/spec/public/router/resources_spec.rb +0 -82
  249. data/spec/public/router/spec_helper.rb +0 -90
  250. data/spec/public/router/special_spec.rb +0 -61
  251. data/spec/public/router/string_spec.rb +0 -61
  252. data/spec/public/session/controllers/sessions.rb +0 -56
  253. data/spec/public/session/cookie_session_spec.rb +0 -73
  254. data/spec/public/session/memcached_session_spec.rb +0 -31
  255. data/spec/public/session/memory_session_spec.rb +0 -28
  256. data/spec/public/session/multiple_sessions_spec.rb +0 -74
  257. data/spec/public/session/no_session_spec.rb +0 -12
  258. data/spec/public/session/session_spec.rb +0 -106
  259. data/spec/public/template/template_spec.rb +0 -104
  260. data/spec/public/template/templates/error.html.erb +0 -2
  261. data/spec/public/template/templates/template.html.erb +0 -1
  262. data/spec/public/template/templates/template.html.myt +0 -1
  263. data/spec/public/test/controller_matchers_spec.rb +0 -412
  264. data/spec/public/test/controllers/controller_assertion_mock.rb +0 -7
  265. data/spec/public/test/controllers/dispatch_controller.rb +0 -11
  266. data/spec/public/test/controllers/spec_helper_controller.rb +0 -39
  267. data/spec/public/test/multipart_request_helper_spec.rb +0 -159
  268. data/spec/public/test/multipart_upload_text_file.txt +0 -1
  269. data/spec/public/test/request_helper_spec.rb +0 -269
  270. data/spec/public/test/route_helper_spec.rb +0 -78
  271. data/spec/public/test/route_matchers_spec.rb +0 -166
  272. data/spec/public/test/view_helper_spec.rb +0 -96
  273. data/spec/public/test/view_matchers_spec.rb +0 -183
  274. data/spec/spec_helper.rb +0 -121
@@ -1,5 +1,6 @@
1
1
  module Merb::Test::MultipartRequestHelper
2
2
  require 'rubygems'
3
+ gem "mime-types"
3
4
  require 'mime/types'
4
5
 
5
6
  class Param
@@ -129,7 +130,7 @@ module Merb::Test::MultipartRequestHelper
129
130
  def multipart_post(path, params = {}, env = {}, &block)
130
131
  env[:request_method] = "POST"
131
132
  env[:test_with_multipart] = true
132
- request(path, params, env, &block)
133
+ mock_request(path, params, env, &block)
133
134
  end
134
135
 
135
136
  # An HTTP PUT request that operates through the router and uses multipart
@@ -149,7 +150,7 @@ module Merb::Test::MultipartRequestHelper
149
150
  def multipart_put(path, params = {}, env = {}, &block)
150
151
  env[:request_method] = "PUT"
151
152
  env[:test_with_multipart] = true
152
- request(path, params, env, &block)
153
+ mock_request(path, params, env, &block)
153
154
  end
154
155
 
155
156
  # ==== Parameters
@@ -1,393 +1,61 @@
1
- require 'tempfile'
1
+ require "rack"
2
2
 
3
3
  module Merb
4
4
  module Test
5
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
6
 
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)
7
+ def describe_request(rack)
8
+ "a #{rack.original_env[:method] || rack.original_env["REQUEST_METHOD"] || "GET"} to '#{rack.url}'"
43
9
  end
44
10
 
45
- # CookieJar keeps track of cookies in a simple Mash.
46
- class CookieJar < Mash
47
-
48
- # ==== Parameters
49
- # request<Merb::Request, Merb::FakeRequest>:: The controller request.
50
- def update_from_request(request)
51
- request.cookies.each do |key, value|
52
- if value.blank?
53
- self.delete(key)
54
- else
55
- self[key] = Merb::Request.unescape(value)
56
- end
57
- end
58
- end
59
-
60
- end
61
-
62
- # ==== Parameters
63
- # env<Hash>:: A hash of environment keys to be merged into the default list.
64
- # opt<Hash>:: A hash of options (see below).
65
- #
66
- # ==== Options (opt)
67
- # :post_body<String>:: The post body for the request.
68
- # :req<String>::
69
- # The request string. This will only be used if :post_body is left out.
70
- #
71
- # ==== Returns
72
- # FakeRequest:: A Request object that is built based on the parameters.
73
- #
74
- # ==== Notes
75
- # If you pass a post body, the content-type will be set to URL-encoded.
76
- #
77
- #---
78
- # @public
79
- def fake_request(env = {}, opt = {})
80
- if opt[:post_body]
81
- req = opt[:post_body]
82
- env[:content_type] ||= "application/x-www-form-urlencoded"
11
+ def describe_input(input)
12
+ if input.respond_to?(:controller_name)
13
+ "#{input.controller_name}##{input.action_name}"
14
+ elsif input.respond_to?(:original_env)
15
+ describe_request(input)
83
16
  else
84
- req = opt[:req]
17
+ input
85
18
  end
86
- FakeRequest.new(env, StringIO.new(req || ''))
87
- end
88
-
89
- # Dispatches an action to the given class. This bypasses the router and is
90
- # suitable for unit testing of controllers.
91
- #
92
- # ==== Parameters
93
- # controller_klass<Controller>::
94
- # The controller class object that the action should be dispatched to.
95
- # action<Symbol>:: The action name, as a symbol.
96
- # params<Hash>::
97
- # An optional hash that will end up as params in the controller instance.
98
- # env<Hash>::
99
- # An optional hash that is passed to the fake request. Any request options
100
- # should go here (see +fake_request+), including :req or :post_body
101
- # for setting the request body itself.
102
- # &blk::
103
- # The controller is yielded to the block provided for actions *prior* to
104
- # the action being dispatched.
105
- #
106
- # ==== Example
107
- # dispatch_to(MyController, :create, :name => 'Homer' ) do |controller|
108
- # controller.stub!(:current_user).and_return(@user)
109
- # end
110
- #
111
- # ==== Notes
112
- # Does not use routes.
113
- #
114
- #---
115
- # @public
116
- def dispatch_to(controller_klass, action, params = {}, env = {}, &blk)
117
- params = merge_controller_and_action(controller_klass, action, params)
118
- dispatch_request(build_request(params, env), controller_klass, action.to_s, &blk)
119
19
  end
120
20
 
121
- # Keep track of cookie values in CookieJar within the context of the
122
- # block; you need to set this up for secific controllers.
123
- #
124
- # ==== Parameters
125
- # *controller_classes:: Controller classes to operate on in the context of the block.
126
- # &blk:: The context to operate on; optionally accepts the cookie jar as an argument.
127
- def with_cookies(*controller_classes, &blk)
128
- cookie_jar = CookieJar.new
129
- before_cb = lambda { |c| c.cookies.update(cookie_jar) }
130
- after_cb = lambda { |c| cookie_jar.update_from_request(c.request) }
131
- controller_classes.each do |klass|
132
- klass._before_dispatch_callbacks << before_cb
133
- klass._after_dispatch_callbacks << after_cb
134
- end
135
- blk.arity == 1 ? blk.call(cookie_jar) : blk.call
136
- controller_classes.each do |klass|
137
- klass._before_dispatch_callbacks.delete before_cb
138
- klass._after_dispatch_callbacks.delete after_cb
139
- end
140
- end
141
-
142
- # Dispatches an action to the given class and using HTTP Basic Authentication
143
- # This bypasses the router and is suitable for unit testing of controllers.
144
- #
145
- # ==== Parameters
146
- # controller_klass<Controller>::
147
- # The controller class object that the action should be dispatched to.
148
- # action<Symbol>:: The action name, as a symbol.
149
- # username<String>:: The username.
150
- # password<String>:: The password.
151
- # params<Hash>::
152
- # An optional hash that will end up as params in the controller instance.
153
- # env<Hash>::
154
- # An optional hash that is passed to the fake request. Any request options
155
- # should go here (see +fake_request+), including :req or :post_body
156
- # for setting the request body itself.
157
- # &blk::
158
- # The controller is yielded to the block provided for actions *prior* to
159
- # the action being dispatched.
160
- #
161
- # ==== Example
162
- # dispatch_with_basic_authentication_to(MyController, :create, 'Fred', 'secret', :name => 'Homer' ) do |controller|
163
- # controller.stub!(:current_user).and_return(@user)
164
- # end
165
- #
166
- # ==== Notes
167
- # Does not use routes.
168
- #
169
- #---
170
- # @public
171
- def dispatch_with_basic_authentication_to(controller_klass, action, username, password, params = {}, env = {}, &blk)
172
- env["X_HTTP_AUTHORIZATION"] = "Basic #{Base64.encode64("#{username}:#{password}")}"
173
-
174
- params = merge_controller_and_action(controller_klass, action, params)
175
- dispatch_request(build_request(params, env), controller_klass, action.to_s, &blk)
176
- end
177
-
178
- def merge_controller_and_action(controller_klass, action, params)
179
- params[:controller] = controller_klass.name.to_const_path
180
- params[:action] = action.to_s
181
-
182
- params
183
- end
184
-
185
- # Prepares and returns a request suitable for dispatching with
186
- # dispatch_request. If you don't need to modify the request
187
- # object before dispatching (e.g. to add cookies), you probably
188
- # want to use dispatch_to instead.
189
- #
190
- # ==== Parameters
191
- # params<Hash>::
192
- # An optional hash that will end up as params in the controller instance.
193
- # env<Hash>::
194
- # An optional hash that is passed to the fake request. Any request options
195
- # should go here (see +fake_request+), including :req or :post_body
196
- # for setting the request body itself.
197
- #
198
- # ==== Example
199
- # req = build_request(:id => 1)
200
- # req.cookies['app_cookie'] = "testing"
201
- # dispatch_request(req, MyController, :edit)
202
- #
203
- # ==== Notes
204
- # Does not use routes.
205
- #
206
- #---
207
- # @public
208
- def build_request(params = {}, env = {})
209
- params = Merb::Request.params_to_query_string(params)
210
-
211
- query_string = env[:query_string] || env['QUERY_STRING']
212
- env[:query_string] = query_string ? "#{query_string}&#{params}" : params
213
-
214
- post_body = env[:post_body] || env['POST_BODY']
215
- fake_request(env, { :post_body => post_body, :req => env[:req] })
21
+ def status_code(input)
22
+ input.respond_to?(:status) ? input.status : input
216
23
  end
217
24
 
218
- # An HTTP GET request that operates through the router.
219
- #
220
- # ==== Parameters
221
- # path<String>:: The path that should go to the router as the request uri.
222
- # params<Hash>::
223
- # An optional hash that will end up as params in the controller instance.
224
- # env<Hash>::
225
- # An optional hash that is passed to the fake request. Any request options
226
- # should go here (see +fake_request+).
227
- # &blk::
228
- # The controller is yielded to the block provided for actions *prior* to
229
- # the action being dispatched.
230
- #---
231
- # @public
232
- def get(path, params = {}, env = {}, &block)
233
- env[:request_method] = "GET"
234
- request(path, params, env, &block)
235
- end
236
-
237
- # An HTTP POST request that operates through the router.
238
- #
239
- # ==== Parameters
240
- # path<String>:: The path that should go to the router as the request uri.
241
- # params<Hash>::
242
- # An optional hash that will end up as params in the controller instance.
243
- # env<Hash>::
244
- # An optional hash that is passed to the fake request. Any request options
245
- # should go here (see fake_request).
246
- # &blk::
247
- # The controller is yielded to the block provided for actions *prior* to
248
- # the action being dispatched.
249
- #---
250
- # @public
251
- def post(path, params = {}, env = {}, &block)
252
- env[:request_method] = "POST"
253
- request(path, params, env, &block)
254
- end
255
-
256
- # An HTTP PUT request that operates through the router.
257
- #
258
- # ==== Parameters
259
- # path<String>:: The path that should go to the router as the request uri.
260
- # params<Hash>::
261
- # An optional hash that will end up as params in the controller instance.
262
- # env<Hash>::
263
- # An optional hash that is passed to the fake request. Any request options
264
- # should go here (see fake_request).
265
- # &blk::
266
- # The controller is yielded to the block provided for actions *prior* to
267
- # the action being dispatched.
268
- #---
269
- # @public
270
- def put(path, params = {}, env = {}, &block)
271
- env[:request_method] = "PUT"
272
- request(path, params, env, &block)
273
- end
25
+ def request(uri, env = {})
26
+ uri = url(uri) if uri.is_a?(Symbol)
274
27
 
275
- # An HTTP DELETE request that operates through the router
276
- #
277
- # ==== Parameters
278
- # path<String>:: The path that should go to the router as the request uri.
279
- # params<Hash>::
280
- # An optional hash that will end up as params in the controller instance.
281
- # env<Hash>::
282
- # An optional hash that is passed to the fake request. Any request options
283
- # should go here (see fake_request).
284
- # &blk::
285
- # The controller is yielded to the block provided for actions *prior* to
286
- # the action being dispatched.
287
- #---
288
- # @public
289
- def delete(path, params = {}, env = {}, &block)
290
- env[:request_method] = "DELETE"
291
- request(path, params, env, &block)
292
- end
293
-
294
- # A generic request that checks the router for the controller and action.
295
- # This request goes through the Merb::Router and finishes at the controller.
296
- #
297
- # ==== Parameters
298
- # path<String>:: The path that should go to the router as the request uri.
299
- # params<Hash>::
300
- # An optional hash that will end up as params in the controller instance.
301
- # env<Hash>::
302
- # An optional hash that is passed to the fake request. Any request options
303
- # should go here (see +fake_request+).
304
- # &blk::
305
- # The controller is yielded to the block provided for actions *prior* to
306
- # the action being dispatched.
307
- #
308
- # ==== Example
309
- # request(path, { :name => 'Homer' }, { :request_method => "PUT" }) do |controller|
310
- # controller.stub!(:current_user).and_return(@user)
311
- # end
312
- #
313
- # ==== Notes
314
- # Uses Routes.
315
- #
316
- #---
317
- # @semi-public
318
- def request(path, params = {}, env= {}, &block)
319
- env[:request_method] ||= "GET"
320
- env[:request_uri], env[:query_string] = path.split('?')
321
-
322
- multipart = env.delete(:test_with_multipart)
323
-
324
- request = build_request(params, env)
28
+ if (env[:method] == "POST" || env["REQUEST_METHOD"] == "POST")
29
+ params = env.delete(:body_params) if env.key?(:body_params)
30
+ params = env.delete(:params) if env.key?(:params) && !env.key?(:input)
31
+
32
+ unless env.key?(:input)
33
+ env[:input] = Merb::Request.params_to_query_string(params)
34
+ env["CONTENT_TYPE"] = "application/x-www-form-urlencoded"
35
+ end
36
+ end
325
37
 
326
- opts = check_request_for_route(request) # Check that the request will be routed correctly
327
- controller_name = (opts[:namespace] ? opts.delete(:namespace) + '/' : '') + opts.delete(:controller)
328
- klass = Object.full_const_get(controller_name.snake_case.to_const_string)
329
-
330
- action = opts.delete(:action).to_s
331
- params.merge!(opts)
38
+ if env[:params]
39
+ uri << "&#{Merb::Request.params_to_query_string(env.delete(:body_params))}"
40
+ end
332
41
 
333
- multipart.nil? ? dispatch_to(klass, action, params, env, &block) : dispatch_multipart_to(klass, action, params, env, &block)
334
- end
42
+ if @__cookie__
43
+ env["HTTP_COOKIE"] = @__cookie__
44
+ end
335
45
 
46
+ app = Merb::Rack::Application.new
47
+ rack = app.call(::Rack::MockRequest.env_for(uri, env))
336
48
 
337
- # The workhorse for the dispatch*to helpers.
338
- #
339
- # ==== Parameters
340
- # request<Merb::Test::RequestHelper::FakeRequest, Merb::Request>::
341
- # A request object that has been setup for testing.
342
- # controller_klass<Merb::Controller>::
343
- # The class object off the controller to dispatch the action to.
344
- # action<Symbol>:: The action to dispatch the request to.
345
- # &blk::
346
- # The controller is yielded to the block provided for actions *prior* to
347
- # the action being dispatched.
348
- #
349
- # ==== Returns
350
- # An instance of +controller_klass+ based on the parameters.
351
- #
352
- # ==== Notes
353
- # Does not use routes.
354
- #
355
- #---
356
- # @public
357
- def dispatch_request(request, controller_klass, action, &blk)
358
- controller = controller_klass.new(request)
359
- yield controller if block_given?
360
- controller._dispatch(action)
49
+ rack = Struct.new(:status, :headers, :body, :url, :original_env).
50
+ new(rack[0], rack[1], rack[2], uri, env)
361
51
 
362
- Merb.logger.info controller._benchmarks.inspect
363
- Merb.logger.flush
52
+ @__cookie__ = rack.headers["Set-Cookie"] && rack.headers["Set-Cookie"].join
364
53
 
365
- controller
54
+ rack
366
55
  end
367
-
368
- # Checks to see that a request is routable.
369
- #
370
- # ==== Parameters
371
- # request<Merb::Test::RequestHelper::FakeRequest, Merb::Request>::
372
- # The request object to inspect.
373
- #
374
- # ==== Raises
375
- # Merb::ControllerExceptions::BadRequest::
376
- # No matching route was found.
377
- #
378
- # ==== Returns
379
- # Hash:: The parameters built based on the matching route.
380
- #
381
- #---
382
- # @semi-public
383
- def check_request_for_route(request)
384
- match = ::Merb::Router.match(request)
385
- if match[0].nil? && match[1].empty?
386
- raise ::Merb::ControllerExceptions::BadRequest, "No routes match the request"
387
- else
388
- match[1]
389
- end
390
- end # check_request_for_route
391
- end # RequestHelper
392
- end # Test
393
- end # Merb
56
+ alias requesting request
57
+ alias response_for request
58
+
59
+ end
60
+ end
61
+ end