merb-core 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. data/LICENSE +20 -0
  2. data/README +21 -0
  3. data/Rakefile +285 -0
  4. data/TODO +0 -0
  5. data/bin/merb +8 -0
  6. data/bin/merb-specs +5 -0
  7. data/docs/bootloading.dox +57 -0
  8. data/docs/documentation_standards +40 -0
  9. data/docs/new_render_api +51 -0
  10. data/lib/merb-core.rb +304 -0
  11. data/lib/merb-core/autoload.rb +29 -0
  12. data/lib/merb-core/bootloader.rb +601 -0
  13. data/lib/merb-core/config.rb +284 -0
  14. data/lib/merb-core/constants.rb +43 -0
  15. data/lib/merb-core/controller/abstract_controller.rb +531 -0
  16. data/lib/merb-core/controller/exceptions.rb +257 -0
  17. data/lib/merb-core/controller/merb_controller.rb +214 -0
  18. data/lib/merb-core/controller/mime.rb +88 -0
  19. data/lib/merb-core/controller/mixins/controller.rb +262 -0
  20. data/lib/merb-core/controller/mixins/render.rb +324 -0
  21. data/lib/merb-core/controller/mixins/responder.rb +464 -0
  22. data/lib/merb-core/controller/template.rb +205 -0
  23. data/lib/merb-core/core_ext.rb +12 -0
  24. data/lib/merb-core/core_ext/class.rb +192 -0
  25. data/lib/merb-core/core_ext/hash.rb +422 -0
  26. data/lib/merb-core/core_ext/kernel.rb +304 -0
  27. data/lib/merb-core/core_ext/mash.rb +154 -0
  28. data/lib/merb-core/core_ext/object.rb +136 -0
  29. data/lib/merb-core/core_ext/object_space.rb +14 -0
  30. data/lib/merb-core/core_ext/rubygems.rb +28 -0
  31. data/lib/merb-core/core_ext/set.rb +41 -0
  32. data/lib/merb-core/core_ext/string.rb +69 -0
  33. data/lib/merb-core/dispatch/cookies.rb +92 -0
  34. data/lib/merb-core/dispatch/dispatcher.rb +233 -0
  35. data/lib/merb-core/dispatch/exceptions.html.erb +297 -0
  36. data/lib/merb-core/dispatch/request.rb +560 -0
  37. data/lib/merb-core/dispatch/router.rb +141 -0
  38. data/lib/merb-core/dispatch/router/behavior.rb +777 -0
  39. data/lib/merb-core/dispatch/router/cached_proc.rb +52 -0
  40. data/lib/merb-core/dispatch/router/route.rb +212 -0
  41. data/lib/merb-core/dispatch/session.rb +28 -0
  42. data/lib/merb-core/dispatch/session/cookie.rb +166 -0
  43. data/lib/merb-core/dispatch/session/memcached.rb +161 -0
  44. data/lib/merb-core/dispatch/session/memory.rb +234 -0
  45. data/lib/merb-core/gem_ext/erubis.rb +19 -0
  46. data/lib/merb-core/logger.rb +230 -0
  47. data/lib/merb-core/plugins.rb +25 -0
  48. data/lib/merb-core/rack.rb +15 -0
  49. data/lib/merb-core/rack/adapter.rb +42 -0
  50. data/lib/merb-core/rack/adapter/ebb.rb +22 -0
  51. data/lib/merb-core/rack/adapter/evented_mongrel.rb +24 -0
  52. data/lib/merb-core/rack/adapter/fcgi.rb +16 -0
  53. data/lib/merb-core/rack/adapter/irb.rb +108 -0
  54. data/lib/merb-core/rack/adapter/mongrel.rb +25 -0
  55. data/lib/merb-core/rack/adapter/runner.rb +27 -0
  56. data/lib/merb-core/rack/adapter/thin.rb +27 -0
  57. data/lib/merb-core/rack/adapter/webrick.rb +35 -0
  58. data/lib/merb-core/rack/application.rb +77 -0
  59. data/lib/merb-core/rack/handler/mongrel.rb +97 -0
  60. data/lib/merb-core/server.rb +184 -0
  61. data/lib/merb-core/test.rb +10 -0
  62. data/lib/merb-core/test/helpers.rb +9 -0
  63. data/lib/merb-core/test/helpers/controller_helper.rb +8 -0
  64. data/lib/merb-core/test/helpers/multipart_request_helper.rb +175 -0
  65. data/lib/merb-core/test/helpers/request_helper.rb +257 -0
  66. data/lib/merb-core/test/helpers/route_helper.rb +33 -0
  67. data/lib/merb-core/test/helpers/view_helper.rb +121 -0
  68. data/lib/merb-core/test/matchers.rb +9 -0
  69. data/lib/merb-core/test/matchers/controller_matchers.rb +269 -0
  70. data/lib/merb-core/test/matchers/route_matchers.rb +136 -0
  71. data/lib/merb-core/test/matchers/view_matchers.rb +293 -0
  72. data/lib/merb-core/test/run_specs.rb +38 -0
  73. data/lib/merb-core/test/tasks/spectasks.rb +39 -0
  74. data/lib/merb-core/test/test_ext/hpricot.rb +32 -0
  75. data/lib/merb-core/test/test_ext/object.rb +14 -0
  76. data/lib/merb-core/vendor/facets.rb +2 -0
  77. data/lib/merb-core/vendor/facets/dictionary.rb +433 -0
  78. data/lib/merb-core/vendor/facets/inflect.rb +211 -0
  79. data/lib/merb-core/version.rb +11 -0
  80. data/spec/private/config/adapter_spec.rb +32 -0
  81. data/spec/private/config/config_spec.rb +139 -0
  82. data/spec/private/config/environment_spec.rb +13 -0
  83. data/spec/private/config/spec_helper.rb +1 -0
  84. data/spec/private/core_ext/hash_spec.rb +506 -0
  85. data/spec/private/core_ext/kernel_spec.rb +46 -0
  86. data/spec/private/core_ext/object_spec.rb +39 -0
  87. data/spec/private/core_ext/set_spec.rb +26 -0
  88. data/spec/private/core_ext/string_spec.rb +9 -0
  89. data/spec/private/dispatch/cookies_spec.rb +107 -0
  90. data/spec/private/dispatch/dispatch_spec.rb +26 -0
  91. data/spec/private/dispatch/fixture/app/controllers/application.rb +4 -0
  92. data/spec/private/dispatch/fixture/app/controllers/exceptions.rb +27 -0
  93. data/spec/private/dispatch/fixture/app/controllers/foo.rb +21 -0
  94. data/spec/private/dispatch/fixture/app/helpers/global_helpers.rb +8 -0
  95. data/spec/private/dispatch/fixture/app/views/exeptions/client_error.html.erb +37 -0
  96. data/spec/private/dispatch/fixture/app/views/exeptions/internal_server_error.html.erb +216 -0
  97. data/spec/private/dispatch/fixture/app/views/exeptions/not_acceptable.html.erb +38 -0
  98. data/spec/private/dispatch/fixture/app/views/exeptions/not_found.html.erb +40 -0
  99. data/spec/private/dispatch/fixture/app/views/foo/bar.html.erb +0 -0
  100. data/spec/private/dispatch/fixture/app/views/layout/application.html.erb +11 -0
  101. data/spec/private/dispatch/fixture/config/environments/development.rb +6 -0
  102. data/spec/private/dispatch/fixture/config/environments/production.rb +5 -0
  103. data/spec/private/dispatch/fixture/config/environments/test.rb +6 -0
  104. data/spec/private/dispatch/fixture/config/init.rb +45 -0
  105. data/spec/private/dispatch/fixture/config/rack.rb +1 -0
  106. data/spec/private/dispatch/fixture/config/router.rb +35 -0
  107. data/spec/private/dispatch/fixture/log/development.log +1 -0
  108. data/spec/private/dispatch/fixture/log/merb.4000.pid +1 -0
  109. data/spec/private/dispatch/fixture/log/merb_test.log +2040 -0
  110. data/spec/private/dispatch/fixture/log/production.log +1 -0
  111. data/spec/private/dispatch/fixture/merb.4000.pid +1 -0
  112. data/spec/private/dispatch/fixture/public/images/merb.jpg +0 -0
  113. data/spec/private/dispatch/fixture/public/merb.fcgi +4 -0
  114. data/spec/private/dispatch/fixture/public/stylesheets/master.css +119 -0
  115. data/spec/private/dispatch/route_params_spec.rb +24 -0
  116. data/spec/private/dispatch/spec_helper.rb +1 -0
  117. data/spec/private/plugins/plugin_spec.rb +81 -0
  118. data/spec/private/rack/application_spec.rb +43 -0
  119. data/spec/public/DEFINITIONS +11 -0
  120. data/spec/public/abstract_controller/controllers/alt_views/layout/application.erb +1 -0
  121. data/spec/public/abstract_controller/controllers/alt_views/layout/merb/test/fixtures/abstract/render_string_controller_layout.erb +1 -0
  122. data/spec/public/abstract_controller/controllers/alt_views/layout/merb/test/fixtures/abstract/render_template_controller_layout.erb +1 -0
  123. data/spec/public/abstract_controller/controllers/alt_views/merb/test/fixtures/abstract/display_object_with_multiple_roots/index.erb +1 -0
  124. data/spec/public/abstract_controller/controllers/alt_views/merb/test/fixtures/abstract/display_object_with_multiple_roots/show.erb +1 -0
  125. data/spec/public/abstract_controller/controllers/alt_views/merb/test/fixtures/abstract/render_template_multiple_roots/index.erb +1 -0
  126. data/spec/public/abstract_controller/controllers/alt_views/partial/basic_partial_with_multiple_roots/_partial.erb +1 -0
  127. data/spec/public/abstract_controller/controllers/alt_views/render_template_multiple_roots_and_custom_location/index.erb +1 -0
  128. data/spec/public/abstract_controller/controllers/alt_views/render_template_multiple_roots_inherited/index.erb +1 -0
  129. data/spec/public/abstract_controller/controllers/display.rb +54 -0
  130. data/spec/public/abstract_controller/controllers/filters.rb +167 -0
  131. data/spec/public/abstract_controller/controllers/helpers.rb +31 -0
  132. data/spec/public/abstract_controller/controllers/partial.rb +106 -0
  133. data/spec/public/abstract_controller/controllers/render.rb +86 -0
  134. data/spec/public/abstract_controller/controllers/views/helpers/capture/index.erb +1 -0
  135. data/spec/public/abstract_controller/controllers/views/helpers/concat/index.erb +1 -0
  136. data/spec/public/abstract_controller/controllers/views/layout/alt.erb +1 -0
  137. data/spec/public/abstract_controller/controllers/views/layout/custom.erb +1 -0
  138. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/display_object/index.erb +1 -0
  139. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/display_object_with_action/new.erb +1 -0
  140. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template/index.erb +1 -0
  141. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_app_layout/index.erb +0 -0
  142. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_custom_layout/index.erb +1 -0
  143. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_multiple_roots/index.erb +1 -0
  144. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_multiple_roots/show.erb +1 -0
  145. data/spec/public/abstract_controller/controllers/views/partial/another_directory/_partial.erb +1 -0
  146. data/spec/public/abstract_controller/controllers/views/partial/basic_partial/_partial.erb +1 -0
  147. data/spec/public/abstract_controller/controllers/views/partial/basic_partial/index.erb +1 -0
  148. data/spec/public/abstract_controller/controllers/views/partial/basic_partial_with_multiple_roots/index.erb +1 -0
  149. data/spec/public/abstract_controller/controllers/views/partial/nested_partial/_first.erb +1 -0
  150. data/spec/public/abstract_controller/controllers/views/partial/nested_partial/_second.erb +1 -0
  151. data/spec/public/abstract_controller/controllers/views/partial/nested_partial/index.erb +1 -0
  152. data/spec/public/abstract_controller/controllers/views/partial/partial_in_another_directory/index.erb +1 -0
  153. data/spec/public/abstract_controller/controllers/views/partial/partial_with_both/_collection.erb +1 -0
  154. data/spec/public/abstract_controller/controllers/views/partial/partial_with_both/index.erb +1 -0
  155. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections/_collection.erb +1 -0
  156. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections/index.erb +1 -0
  157. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_as/_collection.erb +1 -0
  158. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_as/index.erb +1 -0
  159. data/spec/public/abstract_controller/controllers/views/partial/partial_with_locals/_variables.erb +1 -0
  160. data/spec/public/abstract_controller/controllers/views/partial/partial_with_locals/index.erb +1 -0
  161. data/spec/public/abstract_controller/controllers/views/partial/partial_with_with_and_locals/_both.erb +1 -0
  162. data/spec/public/abstract_controller/controllers/views/partial/partial_with_with_and_locals/index.erb +1 -0
  163. data/spec/public/abstract_controller/controllers/views/partial/with_as_partial/_with_partial.erb +1 -0
  164. data/spec/public/abstract_controller/controllers/views/partial/with_as_partial/index.erb +1 -0
  165. data/spec/public/abstract_controller/controllers/views/partial/with_nil_partial/_with_partial.erb +1 -0
  166. data/spec/public/abstract_controller/controllers/views/partial/with_nil_partial/index.erb +1 -0
  167. data/spec/public/abstract_controller/controllers/views/partial/with_partial/_with_partial.erb +1 -0
  168. data/spec/public/abstract_controller/controllers/views/partial/with_partial/index.erb +1 -0
  169. data/spec/public/abstract_controller/controllers/views/test_display/foo.html.erb +1 -0
  170. data/spec/public/abstract_controller/controllers/views/test_render/foo.html.erb +0 -0
  171. data/spec/public/abstract_controller/controllers/views/wonderful/index.erb +1 -0
  172. data/spec/public/abstract_controller/display_spec.rb +33 -0
  173. data/spec/public/abstract_controller/filter_spec.rb +80 -0
  174. data/spec/public/abstract_controller/helper_spec.rb +13 -0
  175. data/spec/public/abstract_controller/partial_spec.rb +53 -0
  176. data/spec/public/abstract_controller/render_spec.rb +70 -0
  177. data/spec/public/abstract_controller/spec_helper.rb +27 -0
  178. data/spec/public/boot_loader/boot_loader_spec.rb +33 -0
  179. data/spec/public/boot_loader/spec_helper.rb +1 -0
  180. data/spec/public/controller/base_spec.rb +31 -0
  181. data/spec/public/controller/controllers/base.rb +41 -0
  182. data/spec/public/controller/controllers/display.rb +40 -0
  183. data/spec/public/controller/controllers/responder.rb +67 -0
  184. data/spec/public/controller/controllers/url.rb +7 -0
  185. data/spec/public/controller/controllers/views/layout/custom.html.erb +1 -0
  186. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_provides/index.html.erb +1 -0
  187. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_provides/index.xml.erb +1 -0
  188. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template/index.html.erb +1 -0
  189. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/html_default/index.html.erb +1 -0
  190. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/layout/custom.html.erb +1 -0
  191. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/local_provides/index.html.erb +1 -0
  192. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/local_provides/index.xml.erb +1 -0
  193. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/multi_provides/index.html.erb +1 -0
  194. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/multi_provides/index.js.erb +1 -0
  195. data/spec/public/controller/display_spec.rb +34 -0
  196. data/spec/public/controller/log/merb.4000.pid +1 -0
  197. data/spec/public/controller/responder_spec.rb +95 -0
  198. data/spec/public/controller/spec_helper.rb +9 -0
  199. data/spec/public/controller/url_spec.rb +152 -0
  200. data/spec/public/directory_structure/directory/app/controllers/application.rb +3 -0
  201. data/spec/public/directory_structure/directory/app/controllers/base.rb +13 -0
  202. data/spec/public/directory_structure/directory/app/controllers/custom.rb +19 -0
  203. data/spec/public/directory_structure/directory/app/views/base/template.html.erb +1 -0
  204. data/spec/public/directory_structure/directory/app/views/wonderful/template.erb +1 -0
  205. data/spec/public/directory_structure/directory/config/router.rb +3 -0
  206. data/spec/public/directory_structure/directory/log/merb.4000.pid +1 -0
  207. data/spec/public/directory_structure/directory/log/merb_test.log +265 -0
  208. data/spec/public/directory_structure/directory/merb.4000.pid +1 -0
  209. data/spec/public/directory_structure/directory_spec.rb +44 -0
  210. data/spec/public/logger/logger_spec.rb +175 -0
  211. data/spec/public/logger/spec_helper.rb +1 -0
  212. data/spec/public/reloading/directory/app/controllers/application.rb +3 -0
  213. data/spec/public/reloading/directory/app/controllers/reload.rb +6 -0
  214. data/spec/public/reloading/directory/config/init.rb +2 -0
  215. data/spec/public/reloading/directory/log/merb.4000.pid +1 -0
  216. data/spec/public/reloading/directory/log/merb_test.log +59 -0
  217. data/spec/public/reloading/directory/merb.4000.pid +1 -0
  218. data/spec/public/reloading/reload_spec.rb +80 -0
  219. data/spec/public/request/multipart_spec.rb +15 -0
  220. data/spec/public/request/request_spec.rb +207 -0
  221. data/spec/public/router/default_spec.rb +21 -0
  222. data/spec/public/router/deferred_spec.rb +22 -0
  223. data/spec/public/router/namespace_spec.rb +113 -0
  224. data/spec/public/router/nested_resources_spec.rb +34 -0
  225. data/spec/public/router/resource_spec.rb +45 -0
  226. data/spec/public/router/resources_spec.rb +57 -0
  227. data/spec/public/router/spec_helper.rb +72 -0
  228. data/spec/public/router/special_spec.rb +44 -0
  229. data/spec/public/router/string_spec.rb +61 -0
  230. data/spec/public/template/template_spec.rb +92 -0
  231. data/spec/public/template/templates/error.html.erb +2 -0
  232. data/spec/public/template/templates/template.html.erb +1 -0
  233. data/spec/public/template/templates/template.html.myt +1 -0
  234. data/spec/public/test/controller_matchers_spec.rb +378 -0
  235. data/spec/public/test/controllers/controller_assertion_mock.rb +7 -0
  236. data/spec/public/test/controllers/dispatch_controller.rb +11 -0
  237. data/spec/public/test/controllers/spec_helper_controller.rb +30 -0
  238. data/spec/public/test/multipart_request_helper_spec.rb +159 -0
  239. data/spec/public/test/multipart_upload_text_file.txt +1 -0
  240. data/spec/public/test/request_helper_spec.rb +153 -0
  241. data/spec/public/test/route_helper_spec.rb +54 -0
  242. data/spec/public/test/route_matchers_spec.rb +133 -0
  243. data/spec/public/test/view_helper_spec.rb +96 -0
  244. data/spec/public/test/view_matchers_spec.rb +107 -0
  245. data/spec/spec_helper.rb +71 -0
  246. metadata +488 -0
@@ -0,0 +1,21 @@
1
+ require File.join(File.dirname(__FILE__), "spec_helper")
2
+
3
+ describe "The default routes" do
4
+
5
+ before :each do
6
+ Merb::Router.prepare {|r| r.default_routes}
7
+ end
8
+
9
+ it "should match /foo to the Foo controller and index action" do
10
+ route_to("/foo").should have_route(:controller => "foo", :action => "index", :id => nil)
11
+ end
12
+
13
+ it "should match /foo/bar to the Foo controller and the bar action" do
14
+ route_to("/foo/bar").should have_route(:controller => "foo", :action => "bar", :id => nil)
15
+ end
16
+
17
+ it "should match /foo/bar/12 to the Foo controller, the bar action, and id of 12" do
18
+ route_to("/foo/bar/12").should have_route(:controller => "foo", :action => "bar", :id => "12")
19
+ end
20
+
21
+ end
@@ -0,0 +1,22 @@
1
+ require File.join(File.dirname(__FILE__), "spec_helper")
2
+
3
+ describe "Deferred routes" do
4
+
5
+ before :each do
6
+ Merb::Router.prepare do |r|
7
+ r.match("/deferred/:zoo").defer_to do |request, params|
8
+ params.merge(:controller => "w00t") if params[:zoo]
9
+ end
10
+ r.default_routes
11
+ end
12
+ end
13
+
14
+ it "should match routes based on the incoming params" do
15
+ route_to("/deferred/baz", :boo => "12").should have_route(:controller => "w00t", :zoo => "baz")
16
+ end
17
+
18
+ it "should fall back to the default route if the deferred condition is not met" do
19
+ route_to("/deferred").should have_route(:controller => "deferred", :action => "index")
20
+ end
21
+
22
+ end
@@ -0,0 +1,113 @@
1
+ require File.join(File.dirname(__FILE__), "spec_helper")
2
+ describe "namespaced resource(s) routes" do
3
+
4
+ after :each do
5
+ Merb::Router.named_routes = {}
6
+ Merb::Router.routes = []
7
+ end
8
+
9
+ it "should match a get to /admin/blogposts without setting namespace" do
10
+ Merb::Router.prepare do |r|
11
+ r.match('/admin') do |admin|
12
+ admin.resources :blogposts
13
+ end
14
+ end
15
+ route_to('/admin/blogposts', :method => :get).should have_route(:controller => 'blogposts', :action => 'index', :id => nil, :namespace=>nil)
16
+ end
17
+
18
+ it "should match a get to /admin/blogposts setting namespace manually" do
19
+ Merb::Router.prepare do |r|
20
+ r.match('/admin').to(:namespace => "my_admin") do |admin|
21
+ admin.resources :blogposts
22
+ end
23
+ end
24
+ route_to('/admin/blogposts', :method => :get).should have_route(:controller => 'blogposts', :action => 'index', :id => nil, :namespace=>"my_admin")
25
+ end
26
+
27
+ it "should match a get to /admin/blogposts to the blogposts controller and index action" do
28
+ Merb::Router.prepare do |r|
29
+ r.namespace :admin do |admin|
30
+ admin.resources :blogposts
31
+ end
32
+ end
33
+ route_to('/admin/blogposts', :method => :get).should have_route(:controller => 'blogposts', :action => 'index', :id => nil, :namespace => 'admin')
34
+ end
35
+
36
+ it "should match a get to /admin/foo to the foo controller and show action" do
37
+ Merb::Router.prepare do |r|
38
+ r.namespace :admin do |admin|
39
+ admin.resource :foo
40
+ end
41
+ end
42
+ route_to('/admin/foo', :method => :get).should have_route(:controller => 'foo', :action => 'show', :id => nil)
43
+ end
44
+
45
+ it "should match a get to /admin/foo/blogposts to the blogposts controller and index action" do
46
+ Merb::Router.prepare do |r|
47
+ r.namespace :admin do |admin|
48
+ admin.resource :foo do |foo|
49
+ foo.resources :blogposts
50
+ end
51
+ end
52
+ end
53
+ route_to('/admin/foo/blogposts', :method => :get).should have_route(:controller => 'blogposts', :action => 'index', :id => nil, :namespace => 'admin')
54
+ end
55
+
56
+ it "should match a get to /admin/blogposts/1/foo to the foo controller and the show action" do
57
+ Merb::Router.prepare do |r|
58
+ r.namespace :admin do |admin|
59
+ admin.resources :blogposts do |blogposts|
60
+ blogposts.resource :foo
61
+ end
62
+ end
63
+ end
64
+ route_to('/admin/blogposts/1/foo', :method => :get).should have_route(:controller => 'foo', :action => 'show', :blogpost_id => '1', :id => nil, :namespace => "admin")
65
+ end
66
+
67
+ it "should match a get to /blogposts to the blogposts controller when namespace is passed in to resources" do
68
+ Merb::Router.prepare do |r|
69
+ r.resources :blogposts, :namespace => "admin"
70
+ end
71
+ route_to("/blogposts", :method =>:get).should have_route(:controller => 'blogposts', :action => 'index', :id => nil, :namespace => "admin")
72
+ end
73
+
74
+ it "should match a get to /blogposts/1/foo to the foo controller when namespace is passed in to resources as an option" do
75
+ Merb::Router.prepare do |r|
76
+ r.resources :blogposts, :namespace => "admin" do |blogposts|
77
+ blogposts.resource :foo, :namespace => "admin"
78
+ end
79
+ end
80
+ route_to("/blogposts", :method =>:get).should have_route(:controller => 'blogposts', :action => 'index', :id => nil, :namespace => "admin")
81
+ route_to("/blogposts/1/foo", :method =>:get).should have_route(:controller => 'foo', :action => 'show', :blogpost_id => '1', :namespace => "admin")
82
+ end
83
+
84
+ it "should match a get to /blogposts/1/foo to the foo controller without a namespace" do
85
+ Merb::Router.prepare do |r|
86
+ r.resources :blogposts, :namespace => "admin" do |blogposts|
87
+ blogposts.resource :foo
88
+ end
89
+ end
90
+ route_to("/blogposts/1/foo", :method =>:get).should have_route(:controller => 'foo', :action => 'show', :blogpost_id => '1', :namespace => nil)
91
+ end
92
+
93
+ it "should match a get to /my_admin/blogposts to the blogposts controller with a custom patch setting" do
94
+ Merb::Router.prepare do |r|
95
+ r.namespace(:admin, :path=>"my_admin") do |admin|
96
+ admin.resources :blogposts
97
+ end
98
+ end
99
+ route_to('/my_admin/blogposts', :method => :get).should have_route(:controller => 'blogposts', :action => 'index', :id => nil, :namespace => 'admin')
100
+ end
101
+
102
+ it "should match a get to /admin/blogposts/1/foo to the foo controller and the show action with namespace admin" do
103
+ Merb::Router.prepare do |r|
104
+ r.namespace(:admin, :path=>"") do |admin|
105
+ admin.resources :blogposts do |blogposts|
106
+ blogposts.resource :foo
107
+ end
108
+ end
109
+ end
110
+ route_to('/blogposts/1/foo', :method => :get).should have_route(:controller => 'foo', :action => 'show', :blogpost_id => '1', :id => nil, :namespace => "admin")
111
+ end
112
+
113
+ end
@@ -0,0 +1,34 @@
1
+ require File.join(File.dirname(__FILE__), "spec_helper")
2
+
3
+ Merb::Router.prepare do |r|
4
+ r.resources :blogposts do |b|
5
+ b.resources :comments do |c|
6
+ c.resources :versions
7
+ end
8
+ end
9
+ r.resources :users do |u|
10
+ u.resources :comments
11
+ end
12
+ r.resource :foo do |f|
13
+ f.resources :comments
14
+ end
15
+ end
16
+
17
+ describe "nested resources routes" do
18
+
19
+ it "should match a get to /blogposts/1/comments to the comments controller and index action with blogpost_id" do
20
+ route_to('/blogposts/1/comments', :method => :get).should have_route(:controller => 'comments', :action => 'index', :id => nil, :blogpost_id => '1')
21
+ end
22
+
23
+ it "should match a get to /blogposts/1/comments/2/versions to the versions controller and index action with blogpost_id and comment_id" do
24
+ route_to('/blogposts/1/comments/2/versions', :method => :get).should have_route(:controller => 'versions', :action => 'index', :id => nil, :blogpost_id => '1', :comment_id => '2')
25
+ end
26
+
27
+ it "should match a get to /users/1/comments to the comments controller and index action with user_id" do
28
+ route_to('/users/1/comments', :method => :get).should have_route(:controller => 'comments', :action => 'index', :id => nil, :user_id => '1')
29
+ end
30
+
31
+ it "should match a get to /foo/comments to the comments controller and index action" do
32
+ route_to('/foo/comments', :method => :get).should have_route(:controller => 'comments', :action => 'index', :id => nil)
33
+ end
34
+ end
@@ -0,0 +1,45 @@
1
+ require File.join(File.dirname(__FILE__), "spec_helper")
2
+
3
+ describe "resources routes" do
4
+ before :each do
5
+ Merb::Router.prepare do |r|
6
+ r.resource :foo
7
+ end
8
+ end
9
+
10
+ it "should match a get to /foo to the blogposts controller and show action" do
11
+ route_to('/foo', :method => :get).should have_route(:controller => 'foo', :action => 'show', :id => nil)
12
+ end
13
+
14
+ it "should match a post to /foo to the blogposts controller and create action" do
15
+ route_to('/foo', :method => :post).should have_route(:controller => 'foo', :action => 'create', :id => nil)
16
+ end
17
+
18
+ it "should match a put to /foo to the blogposts controller and update action" do
19
+ route_to('/foo', :method => :put).should have_route(:controller => 'foo', :action => 'update', :id => nil)
20
+ end
21
+
22
+ it "should match a delete to /foo to the blogposts controller and show action" do
23
+ route_to('/foo', :method => :delete).should have_route(:controller => 'foo', :action => 'destroy', :id => nil)
24
+ end
25
+
26
+ it "should match a get to /foo/new to the blogposts controller and new action" do
27
+ route_to('/foo/new', :method => :get).should have_route(:controller => 'foo', :action => 'new', :id => nil)
28
+ end
29
+
30
+ it "should match a get to /foo/edit to the blogposts controller and edit action" do
31
+ route_to('/foo/edit', :method => :get).should have_route(:controller => 'foo', :action => 'edit', :id => nil)
32
+ end
33
+
34
+ it "should match a get to /foo;edit to the blogposts controller and edit action" do
35
+ route_to('/foo;edit', :method => :get).should have_route(:controller => 'foo', :action => 'edit', :id => nil)
36
+ end
37
+
38
+ it "should match a get to /foo/delete to the blogposts controller and delete action" do
39
+ route_to('/foo/delete', :method => :get).should have_route(:controller => 'foo', :action => 'delete', :id => nil)
40
+ end
41
+
42
+ it "should match a get to /foo;delete to the blogposts controller and delete action" do
43
+ route_to('/foo;delete', :method => :get).should have_route(:controller => 'foo', :action => 'delete', :id => nil)
44
+ end
45
+ end
@@ -0,0 +1,57 @@
1
+ require File.join(File.dirname(__FILE__), "spec_helper")
2
+
3
+ describe "resources routes" do
4
+ before :each do
5
+ Merb::Router.prepare do |r|
6
+ r.resources :blogposts
7
+ end
8
+ end
9
+
10
+ it "should match a get to /blogposts to the blogposts controller and index action" do
11
+ route_to('/blogposts', :method => :get).should have_route(:controller => 'blogposts', :action => 'index', :id => nil)
12
+ end
13
+
14
+ it "should match a post to /blogposts to the blogposts controller and create action" do
15
+ route_to('/blogposts', :method => :post).should have_route(:controller => 'blogposts', :action => 'create', :id => nil)
16
+ end
17
+
18
+ it "should match a get to /blogposts/new to the blogposts controller and the new action" do
19
+ route_to('/blogposts/new', :method => :get).should have_route(:controller => 'blogposts', :action => 'new', :id => nil)
20
+ end
21
+
22
+ it "should match a get to /blogposts/1 ot the blogposts controller and the show action with id 1" do
23
+ route_to('/blogposts/1', :method => :get).should have_route(:controller => 'blogposts', :action => 'show', :id => "1")
24
+ end
25
+
26
+ it "should match a put to /blogposts/1 ot the blogposts controller and the update action with id 1" do
27
+ route_to('/blogposts/1', :method => :put).should have_route(:controller => 'blogposts', :action => 'update', :id => "1")
28
+ end
29
+
30
+ it "should match a delete to /blogposts/1 ot the blogposts controller and the destroy action with id 1" do
31
+ route_to('/blogposts/1', :method => :delete).should have_route(:controller => 'blogposts', :action => 'destroy', :id => "1")
32
+ end
33
+
34
+ it "should match a get to /blogposts/1/edit to the blogposts controller and the edit action with id 1" do
35
+ route_to('/blogposts/1/edit', :method => :get).should have_route(:controller => 'blogposts', :action => 'edit', :id => "1")
36
+ end
37
+
38
+ it "should match a get to /blogposts/1;edit to the blogposts controller and the edit action with id 1" do
39
+ route_to('/blogposts/1;edit', :method => :get).should have_route(:controller => 'blogposts', :action => 'edit', :id => "1")
40
+ end
41
+
42
+ it "should not match a put to /blogposts/1/edit" do
43
+ # not sure which of these is the best way to specify what I mean - so they're both in...
44
+ route_to('/blogposts/1/edit', :method => :put).should have_nil_route
45
+ route_to('/blogposts/1/edit', :method => :put).should_not have_route(:controller => 'blogposts', :action => 'edit', :id => "1")
46
+ end
47
+
48
+ it "should not match a put to /blogposts/1;edit" do
49
+ # not sure which of these is the best way to specify what I mean - so they're both in...
50
+ route_to('/blogposts/1;edit', :method => :put).should have_nil_route
51
+ route_to('/blogposts/1;edit', :method => :put).should_not have_route(:controller => 'blogposts', :action => 'edit', :id => "1")
52
+ end
53
+
54
+ it "should match a get to /blogposts/1/delete to the blogposts controller and the delete action with id 1" do
55
+ route_to('/blogposts/1/delete', :method => :get).should have_route(:controller => 'blogposts', :action => 'delete', :id => "1")
56
+ end
57
+ end
@@ -0,0 +1,72 @@
1
+ require File.join(File.dirname(__FILE__), "..", "..", "spec_helper")
2
+ require 'ostruct'
3
+ class SimpleRequest < OpenStruct
4
+
5
+ def method
6
+ @table[:method]
7
+ end
8
+
9
+ def params
10
+ @table
11
+ end
12
+ end
13
+
14
+ def prepare_route(from, to)
15
+ Merb::Router.prepare {|r| r.match(from).to(to)}
16
+ end
17
+
18
+ def route_to(path, args = {}, protocol = "http://")
19
+ Merb::Router.match(SimpleRequest.new({:protocol => protocol, :path => path}.merge(args)))[1]
20
+ end
21
+
22
+ def generate(*args)
23
+ Merb::Router.generate *args
24
+ end
25
+
26
+ module Merb
27
+
28
+ module Test
29
+
30
+ module RspecMatchers
31
+
32
+ class HaveRoute
33
+
34
+ def self.build(expected)
35
+ this = new
36
+ this.instance_variable_set("@expected", expected)
37
+ this
38
+ end
39
+
40
+ def matches?(target)
41
+ @target = target
42
+ @errors = []
43
+ @expected.all? { |param, value| @target[param] == value }
44
+ end
45
+
46
+ def failure_message
47
+ @target.each do |param, value|
48
+ @errors << "Expected :#{param} to be #{@expected[param].inspect}, but was #{value.inspect}" unless
49
+ @expected[param] == value
50
+ end
51
+ @errors << "Got #{@target.inspect}"
52
+ @errors.join("\n")
53
+ end
54
+
55
+ def negative_failure_message
56
+ "Expected #{@expected.inspect} not to be #{@target.inspect}, but it was."
57
+ end
58
+
59
+ def description() "have_route #{@target.inspect}" end
60
+ end
61
+
62
+ def have_route(expected)
63
+ HaveRoute.build(expected)
64
+ end
65
+
66
+ def have_nil_route
67
+ have_route({})
68
+ end
69
+
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,44 @@
1
+ require File.join(File.dirname(__FILE__), "spec_helper")
2
+
3
+ describe "Regex-based routes" do
4
+
5
+ it "should process a simple regex" do
6
+ prepare_route(%r[^/foos?/(bar|baz)/:id], :controller => "foo", :action => "[1]", :id => ":id")
7
+ route_to("/foo/bar/baz").should have_route(:controller => "foo", :action => "bar", :id => "baz")
8
+ route_to("/foos/baz/bam").should have_route(:controller => "foo", :action => "baz", :id => "bam")
9
+ end
10
+
11
+ it "should support inbound user agents" do
12
+ Merb::Router.prepare do |r|
13
+ r.match(%r[^/foo/(.+)], :user_agent => /(MSIE|Gecko)/).
14
+ to(:controller => "foo", :title => "[1]", :action => "show", :agent => ":user_agent[1]")
15
+ end
16
+ route_to("/foo/bar", :user_agent => /MSIE/).should have_route(
17
+ :controller => "foo", :action => "show", :title => "bar", :agent => "MSIE"
18
+ )
19
+ end
20
+
21
+ end
22
+
23
+ describe "Routes that are restricted based on incoming params" do
24
+
25
+ it "should allow you to restrict routes to POST requests" do
26
+ Merb::Router.prepare do |r|
27
+ r.match("/:controller/create/:id").
28
+ to(:action => "create")
29
+ end
30
+ route_to("/foo/create/12", :method => "post").should have_route(
31
+ :controller => "foo", :action => "create", :id => "12"
32
+ )
33
+ end
34
+
35
+ it "should allow you to restrict routes based on protocol" do
36
+ Merb::Router.prepare do |r|
37
+ r.match(:protocol => "http://").to(:controller => "foo", :action => "bar")
38
+ r.default_routes
39
+ end
40
+ route_to("/foo/bar").should have_route(:controller => "foo", :action => "bar")
41
+ route_to("/boo/hoo", :protocol => "https://").should have_route(:controller => "boo", :action => "hoo")
42
+ end
43
+
44
+ end
@@ -0,0 +1,61 @@
1
+ require File.join(File.dirname(__FILE__), "spec_helper")
2
+
3
+ describe "A plain route with no variables" do
4
+
5
+ it "should return the parameters passed to #to" do
6
+ prepare_route("/info", :controller => "info", :action => "foo")
7
+ route_to("/info").should have_route(:controller => "info", :action => "foo", :id => nil)
8
+ end
9
+
10
+ end
11
+
12
+ describe "A route with variables specified as :foo/:bar" do
13
+
14
+ it "should work with :controller/:action/:id" do
15
+ prepare_route("/foo/:action/:id", :controller => "foobar")
16
+ route_to("/foo/bar/baz").should have_route(:controller => "foobar", :action => "bar", :id => "baz")
17
+ end
18
+
19
+ it "should work with :foo/:bar/:baz to :controller => ':foo/:bar'" do
20
+ prepare_route("/:foo/:bar/:baz/:id", :controller => ":foo/:bar", :action => ":baz")
21
+ route_to("/one/two/three/4").should have_route(:controller => "one/two", :action => "three", :id => "4")
22
+ end
23
+
24
+ end
25
+
26
+ describe "A route containing block matchers" do
27
+
28
+ it "should support block matchers as a path namespace" do
29
+ Merb::Router.prepare do |r|
30
+ r.match("/foo") do |path|
31
+ path.match("/bar/:id").to(:controller => "foo/bar", :action => "bar")
32
+ end
33
+ end
34
+ route_to("/foo/bar/1").should have_route(:controller => "foo/bar", :action => "bar", :id => "1")
35
+ end
36
+
37
+ it "should still support :variables in the to route from any level" do
38
+ Merb::Router.prepare do |r|
39
+ r.match("/foo/:bar") do |path|
40
+ path.match("/:baz/:id").to(:controller => "foo", :action => ":id", :id => ":bar/:baz")
41
+ end
42
+ end
43
+ route_to("/foo/hello/goodbye/zoo").should have_route(:controller => "foo", :action => "zoo", :id => "hello/goodbye")
44
+ end
45
+
46
+ end
47
+
48
+ describe "A route containing block matchers for the 'to' section" do
49
+
50
+ it "should point a bunch of 'from' segments to the same 'to'" do
51
+ Merb::Router.prepare do |r|
52
+ r.to(:controller => "foo") do |a|
53
+ a.match("/hello/:action/:id").to(:tag => ":id")
54
+ end
55
+ end
56
+ route_to("/hello/goodbye/tagging").should have_route(
57
+ :controller => "foo", :action => "goodbye", :id => "tagging", :tag => "tagging"
58
+ )
59
+ end
60
+
61
+ end